Python Multiprocessing For-Loop

Python Multiprocessing For Loop



Multiprocesarea este comparabilă cu multiprocesarea. Cu toate acestea, se diferențiază prin faptul că putem executa doar un fir la un moment dat datorită GIL-ului care este folosit pentru threading. Multiprocesarea este procesul de efectuare a operațiunilor secvenţial pe mai multe nuclee CPU. Threadurile nu pot fi operate în paralel. Cu toate acestea, multiprocesarea ne permite să stabilim procesele și să le rulăm simultan pe diferite nuclee CPU. Bucla, cum ar fi bucla for, este unul dintre limbajele de scripting cele mai des folosite. Repetați aceeași lucrare folosind diverse date până când este atins un criteriu, cum ar fi un număr predeterminat de iterații. Bucla realizează fiecare iterație una câte una.

Exemplul 1:  Utilizarea For-Loop în modulul de multiprocesare Python

În acest exemplu, folosim for-loop și procesul de clasă a modulului de multiprocesare Python. Începem cu un exemplu foarte simplu, astfel încât să puteți înțelege rapid cum funcționează bucla pentru multiprocesare Python. Folosind o interfață care este comparabilă cu modulul de threading, multiprocesarea împachetează crearea de procese.







Folosind sub-procesele mai degrabă decât firele de execuție, pachetul de multiprocesare oferă atât concurență locală, cât și la distanță, evitând astfel blocarea globală a interpretului. Utilizați o buclă for, care poate fi un obiect șir sau un tuplu, pentru a repeta continuu printr-o secvență. Acest lucru funcționează mai puțin ca cuvântul cheie văzut în alte limbaje de programare și mai mult ca o metodă iteratoare găsită în alte limbaje de programare. Pornind o nouă multiprocesare, puteți rula o buclă for care execută o procedură concomitent.



Să începem prin a implementa codul pentru executarea codului utilizând instrumentul „spyder”. Credem că „spyder” este și cel mai bun pentru rularea Python. Importăm un proces de modul multiprocesare pe care îl rulează codul. Multiprocesarea în conceptul Python numită „clasă de proces” creează un nou proces Python, îi oferă o metodă de executare a codului și oferă aplicației părinte o modalitate de a gestiona execuția. Clasa Process conține procedurile start() și join(), ambele fiind cruciale.



În continuare, definim o funcție definită de utilizator numită „func”. Deoarece este o funcție definită de utilizator, îi dăm un nume la alegerea noastră. În corpul acestei funcții, trecem variabila „subiect” ca argument și valoarea „matematică”. Apoi, numim funcția „print()”, pasând instrucțiunea „Numele subiectului comun este” precum și argumentul „subiect” care conține valoarea. Apoi, în pasul următor, folosim „if name== _main_”, care vă împiedică să rulați codul atunci când fișierul este importat ca modul și vă permite să faceți acest lucru numai atunci când conținutul este executat ca script.





Secțiunea de condiție cu care începeți poate fi considerată în majoritatea circumstanțelor ca o locație pentru a furniza conținutul care ar trebui să fie executat numai atunci când fișierul dvs. rulează ca script. Apoi, folosim subiectul argument și stocăm câteva valori în el, care sunt „știință”, „engleză” și „calculator”. Procesul primește apoi numele „process1[]” în pasul următor. Apoi, folosim „process(target=func)” pentru a apela funcția din proces. Target este folosit pentru a apela funcția și salvăm acest proces în variabila „P”.

Apoi, folosim „process1” pentru a apela funcția „append()” care adaugă un element la sfârșitul listei pe care o avem în funcția „func”. Deoarece procesul este stocat în variabila „P”, trecem „P” acestei funcții ca argument. În cele din urmă, folosim funcția „start()” cu „P” pentru a începe procesul. După aceea, rulăm din nou metoda în timp ce furnizăm argumentul „subiect” și folosim „pentru” în subiect. Apoi, folosind încă o dată „process1” și metoda „add()”, începem procesul. Procesul rulează apoi și rezultatul este returnat. Procedura i se spune apoi să se termine folosind tehnica „join()”. Procesele care nu apelează la procedura „join()” nu vor ieși. Un punct crucial este că parametrul cheie „args” trebuie utilizat dacă doriți să furnizați argumente prin proces.




Acum, puteți vedea în rezultat că instrucțiunea este afișată mai întâi prin trecerea valorii pentru subiectul „matematică” pe care o trecem în funcția „func” deoarece o numim mai întâi folosind funcția „proces”. Apoi, folosim comanda „append()” pentru a avea valori care erau deja în lista care este adăugată la sfârșit. Apoi, au fost prezentate „știință”, „calculator” și „engleză”. Dar, după cum puteți vedea, valorile nu sunt în ordinea corectă. Acest lucru se datorează faptului că o fac imediat ce procedura este încheiată și își raportează mesajul.

Exemplul 2: Conversia For-Loop secvenţială în For-Loop paralelă de procesare multiplă

În acest exemplu, sarcina buclă de multiprocesare este executată secvenţial înainte de a fi convertită într-o sarcină paralelă pentru buclă. Puteți parcurge secvențele, cum ar fi o colecție sau un șir, în ordinea în care apar folosind buclele for.

Acum, să începem să implementăm codul. În primul rând, importăm „sleep” din modulul de timp. Folosind procedura „sleep()” din modulul de timp, puteți suspenda execuția firului de apel atât timp cât doriți. Apoi, folosim „random” din modulul aleatoriu, definim o funcție cu numele „func” și trecem cuvântul cheie „argu”. Apoi, creăm o valoare aleatorie folosind „val” și o setăm la „aleatoriu”. Apoi, blocăm pentru o perioadă scurtă folosind metoda „sleep()” și trecem „val” ca parametru. Apoi, pentru a transmite un mesaj, rulăm metoda „print()”, trecând cuvintele „ready” și cuvântul cheie „arg” ca parametru, precum și „created” și trecem valoarea folosind „val”.

În cele din urmă, folosim „flush” și îl setăm la „True”. Utilizatorul poate decide dacă să tamponeze sau nu rezultatul utilizând opțiunea de golire din funcția de imprimare a Python. Valoarea implicită a acestui parametru, False, indică faptul că ieșirea nu va fi tamponată. Ieșirea este afișată ca o serie de linii care urmează una pe alta dacă o setați la adevărat. Apoi, folosim „if name== main” pentru a asigura punctele de intrare. În continuare, executăm lucrarea secvenţial. Aici, setăm intervalul la „10”, ceea ce înseamnă că bucla se termină după 10 iterații. Apoi, apelăm funcția „print()”, îi transmitem instrucțiunea de intrare „gata” și folosim opțiunea „flush=True”.


Acum puteți vedea că atunci când executăm codul, bucla face ca funcția să ruleze „de 10” ori. Se repetă de 10 ori, începând cu indicele zero și terminând cu indicele nouă. Fiecare mesaj conține un număr de sarcină care este un număr de funcție pe care îl transmitem ca „arg” și un număr de creație.


Această buclă secvenţială este acum transformată într-o buclă for paralelă cu multiprocesare. Folosim același cod, dar vom merge la câteva biblioteci și funcții suplimentare pentru multiprocesare. Prin urmare, trebuie să importam procesul din multiprocesare, așa cum am explicat mai devreme. Apoi, creăm o funcție numită „func” și trecem cuvântul cheie „arg” înainte de a folosi „val=random” pentru a obține un număr aleator.

Apoi, după ce invocăm metoda „print()” pentru a afișa un mesaj și dăm parametrului „val” pentru a întârzia puțin, folosim funcția „if name= main” pentru a securiza punctele de intrare. După care, creăm un proces și apelăm funcția din proces folosind „process” și trecem „target=func”. Apoi, trecem „func”, „arg”, trecem valoarea „m” și trecem intervalul „10”, ceea ce înseamnă că bucla termină funcția după „10” iterații. Apoi, începem procesul folosind metoda „start()” cu „proces”. Apoi, apelăm la metoda „join()” pentru a aștepta execuția procesului și pentru a finaliza tot procesul după.


Prin urmare, atunci când executăm codul, funcțiile apelează procesul principal și încep execuția lor. Ele sunt, totuși, făcute până când toate sarcinile sunt îndeplinite. Putem vedea asta deoarece fiecare sarcină este efectuată concomitent. Își raportează mesajul imediat ce este terminat. Aceasta înseamnă că, deși mesajele nu sunt în ordine, bucla se termină după ce toate „10” iterații sunt finalizate.

Concluzie

Am acoperit bucla pentru multiprocesare Python în acest articol. Am prezentat și două ilustrații. Prima ilustrație arată cum să utilizați o buclă for în biblioteca de multiprocesare a buclei Python. Și a doua ilustrație arată cum să schimbați o buclă for secvențială într-o buclă for cu procesare multiplă paralelă. Înainte de a construi scriptul pentru multiprocesare Python, trebuie să importam modulul de multiprocesare.