A szálfűzés jelentősen csökkenti a program végrehajtási idejét. Ismerje meg, hogyan valósíthatja meg a szálfűzést Pythonban.
A végrehajtási idő a program hatékonyságának egyik általános mérőszáma. Minél gyorsabb a végrehajtási idő, annál jobb a program. A szálképzés olyan technika, amely lehetővé teszi, hogy egy program több feladatot vagy folyamatot hajtson végre egyidejűleg.
Megtanulja a beépített Python használatát befűzés modul és a egyidejű.jellemzők modult. Mindkét modul egyszerű módokat kínál a szálak létrehozására és kezelésére
A befűzés jelentősége
A szálfűzés csökkenti a programnak egy feladat elvégzéséhez szükséges időt. Ha a job több független feladatot is tartalmaz, akkor a szálfűzést használhatja a feladatok egyidejű futtatására, csökkentve a program várakozási idejét, amíg az egyik feladat befejeződik, mielőtt a következőre lépne.
Például egy olyan program, amely több képfájlt tölt le az internetről. Ez a program szálfűzést használhat a fájlok párhuzamos letöltésére, nem pedig egyenként. Ez kiküszöböli azt az időt, amelyet a programnak várnia kell egy fájl letöltési folyamatának befejezésére, mielőtt a következőre lépne.
Kezdeti program a befűzés előtt
A következő program függvénye egy feladatot jelent. A feladat a program végrehajtásának egy másodpercre történő szüneteltetése. A program kétszer hívja meg a függvényt, így két feladatot hoz létre. Ezután kiszámítja az egész program futásához szükséges időt, majd megjeleníti a képernyőn.
import idő
start_time = time.perf_counter()
defszünet():
nyomtatás("1 másodpercet alszik...")
time.sleep(1)
nyomtatás("Kész aludni...")
szünet()
szünet()
befejezési_idő = time.perf_counter()
nyomtatás(f'Befejezte {kör (befejezési_idő - kezdési_idő, 2)} második (s)")
A kimenet azt mutatja, hogy a program végrehajtása 2,01 másodpercig tartott. Minden feladat egy másodpercet vett igénybe, a kód többi részének végrehajtása 0,01 másodpercet vett igénybe.
A szálfűzést használhatja mindkét feladat egyidejű végrehajtására. Mindkét feladat végrehajtása egy másodpercet vesz igénybe.
Befűzés megvalósítása a menetvágó modul segítségével
A kezdeti kód módosításához a szálfűzés megvalósításához importálja a befűzés modult. Hozzon létre két szálat, szál_1 és szál_2 használni a cérna osztály. Hívja a Rajt metódust minden szálon a végrehajtás megkezdéséhez. Hívja a csatlakozik metódust az egyes szálakon, hogy megvárják a végrehajtás befejezését, mielőtt a program többi része végrehajtódik.
import idő
import befűzés
start_time = time.perf_counter()defszünet():
nyomtatás("1 másodpercet alszik...")
time.sleep(1)
nyomtatás("Kész aludni...")szál_1 = szálfűzés. Szál (cél=szünet)
szál_2 = szálfűzés. Szál (cél=szünet)thread_1.start()
thread_2.start()thread_1.join()
thread_2.join()
befejezési_idő = time.perf_counter()
nyomtatás(f'Befejezte {kör (befejezési_idő - kezdési_idő, 2)} második (s)")
A program mindkét szálat egyidejűleg futtatja. Ez csökkenti mindkét feladat végrehajtásához szükséges időt.
A kimenet azt mutatja, hogy ugyanazon feladatok futtatásához körülbelül egy másodpercre van szükség. Ez fele annyi időnek, mint a kezdeti program.
Threading megvalósítása a concurrent.futures modul használatával
A Python 3.2-ben bemutatták a egyidejű.futures modult. Ez a modul magas szintű interfészt biztosít az aszinkron feladatok szálak segítségével történő végrehajtásához. Egyszerűbb módot biztosít a feladatok párhuzamos végrehajtására.
A kezdeti program szálfűzést használó módosításához importálja a concurrent.features modult. Használja a ThreadPoolExecutor osztályt a concurrent.futures modulból szálkészlet létrehozásához. Nyújtsa be a szünet funkciót kétszer a medencébe. A Beküldés metódus visszaadja a jövő objektum, amely a függvényhívás eredményét reprezentálja.
Ismételje meg a határidős ügyletek és nyomtassa ki eredményeiket a segítségével eredmény módszer.
import idő
import egyidejű.futuresstart_time = time.perf_counter()
defszünet():
nyomtatás("1 másodpercet alszik...")
time.sleep(1)
Visszatérés"Kész aludni..."val vel egyidejű.futures. ThreadPoolExecutor() mint végrehajtó:
eredmények = [executor.submit (szünet) számára _ ban ben hatótávolság(2)]
számára f ban ben concurrent.futures.as_completed (eredmények):
nyomtatás (f.eredmény())befejezési_idő = time.perf_counter()
nyomtatás(f'Befejezte {kör (befejezési_idő - kezdési_idő, 2)} második (s)")
A concurrent.features modul gondoskodik a szálak elindításáról és összekapcsolásáról. Ez tisztábbá teszi a kódot.
A kimenet megegyezik a menetvágó moduléval. A szálfűző modul olyan egyszerű esetekben hasznos, amikor néhány szálat párhuzamosan kell futtatni. Másrészt a concurrent.futures modul hasznos az összetettebb esetekben, amikor sok feladatot kell párhuzamosan futtatni.
A Threading használata valós forgatókönyvben
A fenti program szálak segítségével egy másodperccel csökkentette az időt. A való világban a szálak több időt takarítanak meg. Hozzon létre egy programot, amely letölti a képeket az internetről. Kezdje ezzel új virtuális környezet létrehozása. Futtassa a következő parancsot a terminálban a telepítéshez kéréseket könyvtár:
pip telepítési kérések
A kérések könyvtár lehetővé teszi HTTP-kérések küldését. Importálja a kérések könyvtárát és az időkönyvtárat.
import kéréseket
import idő
Hozzon létre egy listát a letölteni kívánt képek URL-jeiről. Legyen legalább tíz, hogy észrevegye a jelentős különbséget a szálfűzés végrehajtásakor.
img_urls = [
' https://images.unsplash.com/photo-1524429656589-6633a470097c',
' https://images.unsplash.com/photo-1530224264768-7ff8c1789d79',
' https://images.unsplash.com/photo-1564135624576-c5c88640f235',
' https://images.unsplash.com/photo-1541698444083-023c97d3f4b6',
' https://images.unsplash.com/photo-1522364723953-452d3431c267',
' https://images.unsplash.com/photo-1513938709626-033611b8cc03',
' https://images.unsplash.com/photo-1507143550189-fed454f93097',
' https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e',
' https://images.unsplash.com/photo-1504198453319-5ce911bafcde',
' https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99',
' https://images.unsplash.com/photo-1516972810927-80185027ca84',
' https://images.unsplash.com/photo-1550439062-609e1531270e',
]
Lapozzon át a listán URL-ek közül, amelyek minden képet ugyanabba a mappába töltenek le, amely a projektet tartalmazza. Jelenítse meg a képek letöltéséhez szükséges időt úgy, hogy kivonja a befejezési időt a kezdési időpontból.
start_time = time.perf_counter()
számára img_url ban ben img_urls:
img_bytes = kérések.get (img_url).content
img_name = img_url.split('/')[3]
img_name = f'{img_name}.jpg'
val vel nyitott (img_name, "wb") mint img_file:
img_file.write (img_bytes)
nyomtatás(f'{img_name} letöltve...')
befejezési_idő = time.perf_counter()
nyomtatás(f'Befejezte {befejezési_idő – kezdési_idő} másodperc)
A program körülbelül 22 másodpercet vesz igénybe a 12 kép letöltéséhez. Ez eltérő lehet, mivel a képek letöltéséhez szükséges idő az internet sebességétől is függ.
Módosítsa a programot a szálfűzés használatára a concurrent.features modul segítségével. Cikk helyett használjon függvényt. Ez az a funkció, amelyet át kell adni a végrehajtó példa.
import kéréseket
import idő
import egyidejű.futuresimg_urls = [
' https://images.unsplash.com/photo-1524429656589-6633a470097c',
' https://images.unsplash.com/photo-1530224264768-7ff8c1789d79',
' https://images.unsplash.com/photo-1564135624576-c5c88640f235',
' https://images.unsplash.com/photo-1541698444083-023c97d3f4b6',
' https://images.unsplash.com/photo-1522364723953-452d3431c267',
' https://images.unsplash.com/photo-1513938709626-033611b8cc03',
' https://images.unsplash.com/photo-1507143550189-fed454f93097',
' https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e',
' https://images.unsplash.com/photo-1504198453319-5ce911bafcde',
' https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99',
' https://images.unsplash.com/photo-1516972810927-80185027ca84',
' https://images.unsplash.com/photo-1550439062-609e1531270e',
]start_time = time.perf_counter()
defdownload_image(img_url):
img_bytes = kérések.get (img_url).content
img_name = img_url.split('/')[3]
img_name = f'{img_name}.jpg'
val vel nyitott (img_name, "wb") mint img_file:
img_file.write (img_bytes)
nyomtatás(f'{img_name} letöltve...')val vel egyidejű.futures. ThreadPoolExecutor() mint végrehajtó:
executor.map (letöltési_kép, img_urls)befejezési_idő = time.perf_counter()
nyomtatás(f'Befejezte {befejezési_idő-kezdési_idő} másodperc)
A menetfűzés bevezetése után. Az idő jelentősen csökken. Mindössze 4 másodpercbe telt a program végrehajtása.
Befűzésre alkalmas forgatókönyvek
A befűzésre alkalmas forgatókönyvek közül néhány:
- I/O kötött feladatok: Ha a program az idő nagy részét a bemeneti vagy kimeneti műveletek befejezésére vár. A szálkezelés javíthatja a teljesítményt azáltal, hogy lehetővé teszi más feladatok végrehajtását, miközben az I/O műveletek befejezésére vár.
- Webkaparás: A webes lemásolás magában foglalja a HTTP-kéréseket és a HTML-válaszok elemzését. A szálkezelés felgyorsítja a folyamatot, mivel lehetővé teszi több kérés egyidejű benyújtását.
- CPU-hoz kötött feladatok: A szálkezelés segíthet a teljesítmény javításában, mivel lehetővé teszi több feladat párhuzamos végrehajtását.
Ismerkedjen meg más nyelveken a fonalírással
Nem a Python az egyetlen nyelv, amely támogatja a szálfűzést. A legtöbb programozási nyelv támogatja a szálfűzés valamilyen formáját. Fontos, hogy megismerkedjen a szálak megvalósításával más nyelveken. Ez felvértezi Önt a szükséges készségekkel, hogy megbirkózzon a különböző forgatókönyvekkel, ahol a befűzés alkalmazható.