Introducere în multiprocesarea în Python

Pachetul de multiprocesare suportă procesele de reproducere folosind un API similar modulului de filetare. De asemenea, oferă concursuri atât la nivel local, cât și la distanță. Acest tutorial va discuta despre multiprocesarea în Python și modul de utilizare a multiprocesării pentru a comunica între procese și pentru a efectua sincronizarea între procese, precum și logarea.

Introducere în multiprocesare

Multiprocesarea funcționează prin crearea unui Proces obiect și apoi numirea lui start() așa cum se arată mai jos.

de la procesarea multiprocesului Def defet de proces (): print 'hello world' dacă __name__ == '__main__': p = Proces (target = greeting) p.start

În exemplul de mai sus, vom importa mai întâi clasa Process și apoi instanțiăm obiectul Process cu funcția de salut pe care dorim să o executăm.

Apoi, spuneți procesului să înceapă utilizarea start() și finalizăm în final procesul cu a adera() metodă. 

În plus, puteți să transmiteți argumente la această funcție furnizând args cuvinte cheie ca aceasta:

de la procesarea multiprocesului Def het de proces (nume): print 'hello' + "" + nume dacă __name__ == '__main__': p = Proces (target = greeting, args = .a adera() 

Exemplu

Să examinăm un exemplu mai detaliat care acoperă toate conceptele pe care le-am discutat mai sus.

În acest exemplu, vom crea un proces care calculează pătratul de numere și imprimă rezultatele la consola.

(x, x ** 2)) dacă __name__ == '__main__': numere = [43, 50, 5, 98, 34, 35] p = Procesare (țintă = pătrat, args = ('x',)) p.start () p.join print "Done" #result Done 43 pătrat este 1849 50 pătrat este 2500 5 pătrat este 25 98 pătrat este 9604 34 pătrat este 1156 35 pătrat este 1225 

De asemenea, puteți crea mai multe procese în același timp, așa cum se arată în exemplul de mai jos, în care procesul p1 obține rezultatele cifrelor pătrat, în timp ce cel de-al doilea proces p2 verifică dacă numerele date sunt egale.

(x): x pentru numere: print ('% s pătrat este% s'% (x, x ** 2) def este_even (x): pentru x în cifre: == 0: print ('% s este un număr par'% (x)) dacă __name__ == '__main__': numere = [43, 50, 5, 98, 34, 35] argintiu = ('x',) p2 = proces (țintă = is_even, args = ('x',)) p1.start () p2.start #result 43 pătrat este 1849 50 pătrat este 2500 5 pătrat este 25 98 pătrat este 9604 34 pătrat este 1156 35 pătrat este 1225 50 este un număr par de 98 este un număr par, 34 este un număr par 

Comunicarea între procese

Multiprocesarea suportă două tipuri de canale de comunicare între procese:

  • Țevi
  • cozile

cozile

Coadă obiectele sunt folosite pentru a transmite date între procese. Aceștia pot stoca orice obiect Python de măturat și le puteți folosi așa cum se arată în exemplul de mai jos:

importul multiprocesării def este_even (numere, q): pentru n în numere: dacă n% 2 == 0: q.put (n) dacă __name__ == "__main__": q = multiprocesare.Queue țintă = is_even, args = (interval (20), q)) p.start () p.join () în timp ce q: print (q.get ()) 

În exemplul de mai sus, mai întâi creezi o funcție care verifică dacă un număr este chiar și apoi pune rezultatul la sfârșitul coadă. Apoi, instanțiăm un obiect de coadă și un obiect de proces și începem procesul.

În cele din urmă, verificăm dacă coada este goală și, dacă nu, vom obține valorile din partea frontală a coadă și le vom imprima în consola.

Am arătat cum să împărtășim date între două procese utilizând o coadă și rezultatul este așa cum este arătat mai jos.

# rezultat 0 2 4 6 8 10 12 14 16 18

De asemenea, este important să rețineți că Python are un modul Queue care trăiește în modulul de proces și este utilizat pentru a partaja date între fire, spre deosebire de coada de multiprocesare care trăiește în memoria partajată și care este folosită pentru a partaja date între procese.

Țevi

Țevile în procesarea multiplă sunt utilizate în principal pentru comunicarea între procese. Utilizarea este la fel de simplă:

din procesul de import multiprocesare, Pipe def f (conn): conn.send (['hello world']) conn.close () if __name__ == '__main__': parent_conn, child_conn = , args = (copil_conn,)) p.start () print parent_conn.recv () p.join ()

Conductă () returnează două obiecte de conectare care reprezintă cele două capete ale conductei. Fiecare obiect de conexiune are trimite() și recv () metode. Aici vom crea un proces care imprimă șirul Salut Lume și apoi permite accesul la date.

Rezultat

# rezultat ['hello world'] 

Broaste

Broaste lucrați prin asigurarea executării unui singur proces la un moment dat, blocând astfel alte procese de la executarea unui cod similar. Acest lucru permite finalizarea procesului și numai atunci poate fi eliberată blocarea.

Exemplul de mai jos arată o utilizare destul de simplă a metodei Lock.

de la procesul de import multiprocesare, de blocare a definitiei de salut (l, i): l.acquire () print 'hello', i l.release () daca __name__ == '__main__': lock = 'sâmbătă', 'Bernard', 'Patrick', 'Jude', 'Williams'] pentru nume în nume: Proces (target = greeting, args = (lock)). Bernard salut Patrick salut Jude salut Williams 

În acest cod, introducem mai întâi metoda de blocare, achiziționăm-o, executăm funcția de imprimare și apoi eliberăm-o.

Logging

Modulul de multiprocesare oferă, de asemenea, suport pentru logare, deși pachetul de înregistrare nu utilizează încuietori, astfel încât mesajele între procese s-ar putea să se amestece în timpul execuției.

Utilizarea înregistrării este la fel de simplă:

import multiprocesare, logging logger = multiprocessing.log_to_stderr () logger.setLevel (logging.INFO) logger.warning ('Eroare a avut loc')

Aici introducem mai întâi modulele de înregistrare și de multiprocesare și apoi definim multiprocessing.log_to_stderr () , care efectuează un apel către get_logger () precum și adăugarea unui handler care trimite output la sys.stderr. În cele din urmă, am setat nivelul loggerului și mesajul pe care dorim să-l transmitem.

Concluzie

Acest tutorial a acoperit ceea ce este necesar pentru a începe cu multiprocesarea în Python. Multiprocesarea depășește problema GIL (Global Interpreter Lock) deoarece utilizează subprocesele în loc de fire.

Există mult mai multe în documentația Python care nu este acoperită de acest tutorial, deci nu ezitați să vizitați documentele multiprocesare Python și să utilizați puterea completă a acestui modul.

Cod