Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
1. `multiprocessing.pool` pre úlohy viazané na CPU:
Je to vhodné, keď sú vaše iterácie slučky nezávislé a výpočtovo náročné (CPU). Je to efektívne na distribúciu práce vo viacerých jadrách CPU.
`` `Python
importovať multiprientovanie
def my_function (i):
"" "Funkcia, ktorá sa má vykonať paralelne." "
# Váš kód tu ...
result =i * 2 # príklad
výsledok návratnosti
Ak __name__ =='__main__':
s multiprocessing.pool (processes =multiprocessing.cpU_count ()) ako fondy:
Výsledky =Pool.map (my_function, rozsah (10)) # Rozsah (10) je váš rozsah slučky „pre“
Tlač (výsledky) # výstup:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
`` `
`multiprocessing.pool.map` aplikuje` my_function` na každý prvok v rozsahu `(10)` paralelne. `multiprocessing.cpu_count ()` určuje optimálny počet procesov. Upravte to na základe vášho systému a počtu dostupných jadier. Pamätajte si, že `if __name__ =='__main __':` blok je rozhodujúci pre správne multiprocessing v systéme Windows.
2. `concurrent.futures.processpooxecutor` (flexibilnejšie):
To ponúka väčšiu kontrolu a flexibilitu ako „multiprocessing.pool“, najmä ak potrebujete viac jemnozrnnej kontroly alebo spracovania chýb.
`` `Python
import súbežné.
def my_function (i):
# Váš kód tu ...
Výsledok =i * 2
návrat i, výsledok #Returning pôvodného indexu a výsledok je užitočný na sledovanie
Ak __name__ =='__main__':
s Concurrent.futures.ProcesspooLExecutor () ako exekútor:
výsledky =executor.map (my_function, rozsah (10))
Pre i, výsledok vo výsledkoch:
tlač (f "input:{i}, výstup:{result}")
`` `
`Executor.map` je podobný ako„ Pool.map`, ale umožňuje vyzdvihnutie a riešenie výnimiek. Môžete tiež použiť „executor.submit“ na viac asynchrónnej kontroly.
3. `joblib` pre jednoduchšiu syntax (často rýchlejšie):
`Joblib` zjednodušuje paralelné spracovanie, najmä pre numpy polia. Pre konkrétne číselné operácie často funguje lepšie ako „multiprocesívne“.
`` `Python
od joblibu import paralelne, oneskorené
def my_function (i):
# Váš kód tu ...
Výsledok =i * 2
výsledok návratnosti
Ak __name__ =='__main__':
Výsledky =paralelné (n_jobs =multiprocessing.cpu_count ()) (oneskorené (my_funkcia) (i) pre i v rozsahu (10))
Tlač (výsledky)
`` `
`joblib` automaticky spracováva distribúciu úloh a agregáciu výsledkov. `n_jobs 'určuje počet paralelných procesov.
Dôležité úvahy:
* Riadenie: Paralelné spracovanie zavádza režijné náklady z vytvárania procesu a komunikácie. Pre veľmi malé úlohy by režijné náklady mohli prevážiť nad výhodami.
* Zdieľanie údajov: Vyhnite sa zdieľaniu miešaných údajov priamo medzi procesmi; Namiesto toho odovzdajte kópie alebo v prípade potreby používajte komunikačné mechanizmy medzi procesmi (fronty, potrubia).
* závislosti: Uistite sa, že vaše funkcie a ich závislosti sú správne zabalené a dostupné pre každý proces pracovníka.
* I/O viazané úlohy: Ak vaša slučka zahŕňa významné I/O operácie (napr. Žiadosti o sieť, čítanie súborov), použitie „multiprocessing“ nemusí poskytnúť významné zrýchlenie. Zoberme si namiesto toho „Asyncio` alebo` Threading` (hoci `Threading` je obmedzený zámkom globálneho tlmočníka (GIL) v Cpython).
Vyberte prístup, ktorý najlepšie vyhovuje vašim potrebám a charakteristikám vašej úlohy. V jednoduchých prípadoch „Joblib` často poskytuje najjednoduchšie a najúčinnejšie riešenie. Pre zložitejšie scenáre s asynchrónnymi operáciami alebo jemnozrnnou kontrolou je „súbežná.futures“ silnejšie. Nezabudnite vždy profilovať svoj kód a určiť skutočné zisky z výkonu.