Python Multiprocessing For-Loop

Python Multiprocessing For Loop



Multiprocesing je porovnateľný s multithreadingom. Rozlišuje sa však v tom, že môžeme naraz spustiť iba jedno vlákno vďaka GIL, ktorý sa používa na vytváranie vlákien. Viacnásobné spracovanie je proces vykonávania operácií postupne naprieč niekoľkými jadrami procesora. Vlákna nie je možné prevádzkovať paralelne. Viacprocesové spracovanie nám však umožňuje vytvoriť procesy a spustiť ich súbežne na rôznych jadrách CPU. Slučka, ako napríklad for-loop, je jedným z najčastejšie používaných skriptovacích jazykov. Opakujte rovnakú prácu s rôznymi údajmi, kým sa nedosiahne kritérium, napríklad vopred určený počet iterácií. Cyklus vykoná každú iteráciu jednu po druhej.

Príklad 1:  Využitie For-Loop v module Python Multiprocessing Module

V tomto príklade používame for-loop a proces triedy modulov Python multiprocessing. Začneme veľmi jednoduchým príkladom, aby ste rýchlo pochopili, ako funguje multiprocesorový for-loop v Pythone. Pomocou rozhrania, ktoré je porovnateľné s modulom závitovania, multiprocessing zabalí vytváranie procesov.







Využitím podprocesov namiesto vlákien poskytuje multiprocesný balík lokálnu aj vzdialenú súbežnosť, čím sa vyhne globálnemu zámku interpretov. Použite for-loop, čo môže byť objekt typu reťazec alebo n-tica, na nepretržité iterovanie cez sekvenciu. Funguje to menej ako kľúčové slovo v iných programovacích jazykoch a viac ako metóda iterátora v iných programovacích jazykoch. Spustením nového multiprocesingu môžete spustiť for-loop, ktorý vykoná procedúru súbežne.



Začnime implementáciou kódu na spustenie kódu pomocou nástroja „spyder“. Veríme, že „spyder“ je tiež najlepší na spustenie Pythonu. Importujeme proces multiprocesného modulu, v ktorom je spustený kód. Multiprocessing v koncepte Python nazývaný „trieda procesov“ vytvára nový proces Python, dáva mu metódu na spustenie kódu a dáva rodičovskej aplikácii spôsob, ako spravovať vykonávanie. Trieda Process obsahuje procedúry start() a join(), obe sú kľúčové.



Ďalej definujeme užívateľom definovanú funkciu s názvom „func“. Keďže ide o funkciu definovanú používateľom, pomenujeme ju podľa vlastného výberu. Do tela tejto funkcie odovzdáme premennú „subject“ ako argument a hodnotu „maths“. Ďalej zavoláme funkciu „print()“, pričom odovzdáme príkaz „Názov spoločného subjektu je“, ako aj jeho argument „predmet“, ktorý obsahuje hodnotu. Potom v nasledujúcom kroku použijeme „if name== _main_“, ktorý vám bráni spustiť kód, keď sa súbor importuje ako modul, a umožňuje vám to len vtedy, keď sa obsah spustí ako skript.





Sekciu podmienok, s ktorou začínate, možno vo väčšine prípadov považovať za umiestnenie, ktoré poskytuje obsah, ktorý by sa mal spustiť iba vtedy, keď je súbor spustený ako skript. Potom použijeme predmet argumentu a uložíme do neho niektoré hodnoty, ktoré sú „veda“, „angličtina“ a „počítač“. Proces potom v nasledujúcom kroku dostane názov „process1[]“. Potom použijeme „process(target=func)“ na zavolanie funkcie v procese. Target sa používa na volanie funkcie a tento proces uložíme do premennej „P“.

Ďalej použijeme „process1“ na zavolanie funkcie „append()“, ktorá pridá položku na koniec zoznamu, ktorý máme vo funkcii „func“. Pretože proces je uložený v premennej „P“, odovzdáme tejto funkcii „P“ ako jej argument. Nakoniec použijeme funkciu „start()“ s „P“ na spustenie procesu. Potom metódu znova spustíme, pričom zadáme argument „predmet“ a v predmete použijeme „pre“. Potom znova pomocou metódy „process1“ a „add()“ začneme proces. Proces sa potom spustí a výstup sa vráti. Procedúra sa potom musí ukončiť pomocou techniky „join()“. Procesy, ktoré nevolajú procedúru „join()“ sa neskončia. Jedným kľúčovým bodom je, že parameter kľúčového slova „args“ sa musí použiť, ak chcete počas procesu poskytnúť nejaké argumenty.




Teraz môžete vo výstupe vidieť, že príkaz sa zobrazí ako prvý po odovzdaní hodnoty pre predmet „matika“, ktorú prenesieme do funkcie „func“, pretože ju najprv zavoláme pomocou funkcie „process“. Potom použijeme príkaz „append()“, aby sme mali hodnoty, ktoré už boli v zozname, ktorý sa pridáva na koniec. Potom boli prezentované „veda“, „počítač“ a „angličtina“. Ako však vidíte, hodnoty nie sú v správnom poradí. Je to preto, že tak urobia hneď po dokončení postupu a oznámia svoju správu.

Príklad 2: Konverzia sekvenčného For-Loop na multiprocessingový paralelný For-Loop

V tomto príklade sa úloha multiprocessingovej slučky vykonáva sekvenčne predtým, ako sa skonvertuje na paralelnú úlohu for-loop. Pomocou slučiek for môžete prechádzať sekvenciami, ako je kolekcia alebo reťazec v poradí, v akom sa vyskytujú.

Teraz začnime implementovať kód. Najprv importujeme „spánok“ z časového modulu. Pomocou procedúry „sleep()“ v časovom module môžete pozastaviť vykonávanie volajúceho vlákna na ako dlho chcete. Potom použijeme „random“ z náhodného modulu, definujeme funkciu s názvom „func“ a predáme kľúčové slovo „argu“. Potom vytvoríme náhodnú hodnotu pomocou „val“ a nastavíme ju na „random“. Potom pomocou metódy „sleep()“ na chvíľu zablokujeme a ako parameter odovzdáme „val“. Potom na odoslanie správy spustíme metódu „print()“, pričom ako jej parameter odovzdáme slová „ready“ a kľúčové slovo „arg“, ako aj „vytvorené“ a odošleme hodnotu pomocou „val“.

Nakoniec použijeme „flush“ a nastavíme ho na „True“. Používateľ sa môže rozhodnúť, či výstup uloží do vyrovnávacej pamäte alebo nie pomocou možnosti flush vo funkcii tlače Pythonu. Predvolená hodnota tohto parametra False znamená, že výstup sa nebude ukladať do vyrovnávacej pamäte. Ak nastavíte hodnotu true, výstup sa zobrazí ako séria riadkov za sebou. Potom použijeme „if name== main“ na zabezpečenie vstupných bodov. Ďalej vykonáme úlohu postupne. Tu nastavíme rozsah na „10“, čo znamená, že cyklus sa skončí po 10 iteráciách. Ďalej zavoláme funkciu „print()“, odovzdáme jej vstupný príkaz „pripravený“ a použijeme možnosť „flush=True“.


Teraz môžete vidieť, že keď spustíme kód, slučka spôsobí, že sa funkcia spustí „10“ krát. Iteruje 10-krát, počnúc indexom nula a končiac indexom deväť. Každá správa obsahuje číslo úlohy, čo je číslo funkcie, ktoré odovzdávame ako „argument“ a číslo vytvorenia.


Táto sekvenčná slučka sa teraz transformuje na multiprocesnú paralelnú for-loop. Používame rovnaký kód, ale chystáme sa na ďalšie knižnice a funkcie pre multiprocesing. Preto musíme importovať proces z multiprocessingu, ako sme už vysvetlili. Ďalej vytvoríme funkciu s názvom „func“ a pred použitím „val=random“ na získanie náhodného čísla odovzdáme kľúčové slovo „arg“.

Potom, po vyvolaní metódy „print()“ na zobrazenie správy a zadaní parametra „val“ na oneskorenie malej bodky, použijeme funkciu „if name= main“ na zabezpečenie vstupných bodov. Potom vytvoríme proces a zavoláme funkciu v procese pomocou „process“ a predáme „target=func“. Potom prejdeme „func“, „arg“, prejdeme hodnotou „m“ a prejdeme rozsahom „10“, čo znamená, že cyklus ukončí funkciu po „10“ iteráciách. Potom spustíme proces pomocou metódy „start()“ s „process“. Potom zavoláme metódu „join()“, aby sme počkali na vykonanie procesu a dokončili celý proces.


Preto, keď vykonáme kód, funkcie zavolajú hlavný proces a začnú ich vykonávanie. Robia sa však dovtedy, kým nie sú splnené všetky úlohy. Vidíme to, pretože každá úloha sa vykonáva súčasne. Hneď po dokončení hlási svoju správu. To znamená, že hoci správy nie sú v poriadku, cyklus sa skončí po dokončení všetkých „10“ iterácií.

Záver

V tomto článku sme sa zaoberali multiprocesorovým for-loop v Pythone. Predstavili sme aj dve ilustrácie. Prvá ilustrácia ukazuje, ako používať for-loop v knižnici Pythonu na viacprocesové spracovanie. A druhý obrázok ukazuje, ako zmeniť sekvenčnú slučku for na paralelnú slučku for s viacnásobným spracovaním. Pred vytvorením skriptu pre multiprocesing v Pythone musíme importovať modul multiprocessingu.