Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy

Ako je možné implementovať paralelné spracovanie v Pythone pomocou slučky?

Nemôžete priamo paralelne paralelizovať štandard `pre„ slučku v Pythone pomocou iba vstavaného `pre„ Loop Construct. Globálny tlmočník spoločnosti Python (GIL) bráni viacerým vláknám vykonávať pythonové bytekódy súčasne v rámci jedného procesu. To znamená, že skutočný paralelizmus pre úlohy viazané na CPU v rámci „pre„ slučku „pre“ je nemožné iba pri závite.

Môžete však dosiahnuť paralelizmus pomocou multiprocesného, ​​ktorý obchádza GIL vytvorením viacerých procesov. Tu je návod, ako môžete implementovať paralelné spracovanie v Pythone pomocou knižnice „For For 'Loop a„ Multiprocessing “:

Metóda 1:Použitie `multiprocessing.pool.map` (najjednoduchšie pre mnoho rovnakých operácií)

Toto je najjednoduchší prístup, ak každá iterácia vašej slučky vykonáva rovnakú operáciu na rôznych údajoch. `Pool.map` efektívne distribuuje prácu vo viacerých procesoch.

`` `Python

importovať multiprientovanie

def process_item (položka):

"" "Funkcia, ktorá sa má vykonať paralelne pre každú položku." "

# Váš kód na spracovanie jednej položky ide sem

# ... Niektoré výpočty ...

Výsledok návratnosti # Vráťte výsledok výpočtu

Ak __name__ =='__main__':# Dôležité pre kompatibilitu so systémom Windows

údaje =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # vaše údaje

s multiprocessing.pool (processes =multiprocessing.cpU_count ()) ako fondy:

Výsledky =Pool.map (Process_item, Data)

Tlač (výsledky)

`` `

Tento kód vytvára skupinu pracovných procesov (v predvolenom nastavení sa rovná počtu jadier CPU). `Fool.map` aplikuje` Process_item` na každý prvok v `data` súbežne a vráti zoznam výsledkov v rovnakom poradí ako vstup.

Metóda 2:Použitie `multiprocessing.pool.apply_async` (pre zložitejšie scenáre alebo asynchrónne operácie)

Ak vaša slučka zahŕňa zložitejšiu logiku alebo asynchrónne operácie, `Application_async` ponúka väčšiu kontrolu.

`` `Python

importovať multiprientovanie

def process_item (položka):

# ... Váš kód ...

výsledok návratnosti

Ak __name__ =='__main__':

údaje =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Výsledky =[]

s multiprocessing.pool (processes =multiprocessing.cpU_count ()) ako fondy:

# aplik_async vráti objekt asyncresult

async_results =[poco.Apply_async (Process_item, (položka,)) pre položku v údajoch]

# Získajte výsledky (blokovanie, kým sa všetky procesy nedokončia)

Pre async_result v async_results:

results.append (async_result.get ())

Tlač (výsledky)

`` `

`Aplikácia_async` vám umožňuje odosielať úlohy individuálne a načítať výsledky neskôr. Je to užitočné, ak sa čas spracovania pre každú položku výrazne líši.

Dôležité úvahy:

* `if __name__ =='__main __':`: Je to rozhodujúce, najmä v systéme Windows, aby sa zabránilo tvorbe rekurzívneho procesu.

* Zdieľanie údajov: Vyhnite sa zdieľaniu s premenlivými údajmi priamo medzi procesmi. Používajte techniky, ako sú fronty alebo potrubia na komunikáciu medzi procesmi, aby ste zabránili rasovým podmienkam.

* Riadenie: Vytváranie a riadenie procesov má režijné náklady. Paralelné spracovanie je najvýhodnejšie pre výpočtovo náročné úlohy, kde čas spracovania výrazne prevažuje nad režijnými nákladmi.

* Počet procesov: Optimálny počet procesov sa často rovná počtu jadier CPU, ale môžu byť potrebné experimentovať.

Nezabudnite nahradiť `# ... Váš kód ...` S vaším skutočným výpočtom. Vyberte metódu, ktorá najlepšie vyhovuje štruktúre a zložitosti vašich operácií „slučky. Pre jednoduché, paralelne priateľské operácie je „Pool.map“ zvyčajne preferovaným a najúčinnejším prístupom.

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené