English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Il pacchetto di multiprocessori supporta la generazione di processi. Si tratta di una funzione per caricare ed eseguire nuovi sotto-processi. Per far sì che i figli possano terminare o continuare l'esecuzione dei calcoli connessi, il processo attuale deve utilizzare API simili a quelle del modulo thread per attendere.
Quando usiamo Multiprocessing, prima dobbiamo creareproceduraL'oggetto. Poi, chiama unstart()
Il metodo.
import multiprocessing.Process def display(): stampa ('Hi !! Io sono Python') if __name__ == '__main__': p = Process(target=display) p.start() p.join()
In questo esempio, prima importiamo la classe Process, poi usiamo ildisplay()
Per avviare l'oggetto Process.
Poi, usiamostart()
Il metodo inizia a elaborare e poi usa iljoin()
Il metodo è completato.
Possiamo anche passare parametri alla funzione utilizzando la chiave args.
import multiprocessing.Process def display(my_name): stampa ('Hi !!!' + " " + my_name) if __name__ == '__main__': p = Process(target=display, args=('Python',)) p.start() p.join()
In questo esempio, creiamo un processo che calcola il cubo di un numero e stampa tutti i risultati sulla console.
import multiprocessing.Process def cube(x): per x in my_numbers: stampa('%s cubo è %s' % (x, x**3)) if __name__ == '__main__': my_numbers = [3, 4, 5, 6, 7, 8] p = Process(target=cube, args=('x',)) p.start() p.join stampa ("Fatto")
Risultato di output
Fatto 3 cubo è 27 Il cubo di 4 è 64 Il cubo di 5 è 125 Il cubo di 6 è 216 Il cubo di 7 è 343 Il cubo di 8 è 512
Possiamo anche creare più processi contemporaneamente.
In questo esempio, prima creiamo un processo, ovvero process1, che calcola il cubo di un numero, mentre il secondo processo process2 verifica se il numero è pari o dispari.
import multiprocessing.Process def cube(x): per x in my_numbers: stampa('%s cubo è %s' % (x, x**3)) def evenno(x): per x in my_numbers: if x % 2 == 0: stampa('%s è un numero anche' % (x)) if __name__ == '__main__': my_numbers = [3, 4, 5, 6, 7, 8] my_process1 = Process(target=cube, args=('x',)) my_process2 = Process(target=evenno, args=('x',)) my_process1.start() my_process2.start() my_process1.join() my_process2.join() stampa ("Fatto")
Risultato di output
3 cubo è 27 Il cubo di 4 è 64 Il cubo di 5 è 125 Il cubo di 6 è 216 Il cubo di 7 è 343 Il cubo di 8 è 512 4 è un numero pari 6 è un numero pari 8 è un numero pari Fatto
multiprocessing supporta pipe e queue, che sono due canali di comunicazione tra processi.
In multiprocessing, quando dobbiamo comunicare tra processi, in questo caso usiamoPipe.
from multiprocessing import Process, Pipe def myfunction(conn): conn.send(['hi!! I am Python']) conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() p = Process(target=myfunction, args=(child_conn,)) p.start() print(parent_conn.recv()) p.join()
Risultato di output
['hi !!! I am Python']
La pipe restituisce due oggetti connessione, che rappresentano i due estremi della pipe. Ogni oggetto connessione ha due metodisend()
, una possibilità èrecv()
Metodo, un altro è metodo.
In questo esempio, prima di tutto, creiamo un processo che stampa il messaggio "hi !! I am Python", quindi condividiamo i dati.
Quando passiamo dati tra processi, allora possiamo usare l'oggetto Queue.
import multiprocessing def evenno(numbers, q): for n in numbers: if n % 2 == 0: q.put(n) if __name__ == "__main__": q = multiprocessing.Queue() p = multiprocessing.Process(target=evenno, args=(range(10), q)) p.start() p.join() while q: print(q.get())
Risultato di output
0 2 4 6 8
In questo esempio, prima di tutto, creiamo una funzione che verifica se il tempo è un numero pari. Se il numero è pari, lo inseriamo alla fine della coda. Poi creiamo un oggetto coda e un oggetto flusso, quindi avviamo il flusso.
Infine si verifica se la coda è vuota.
Quando stampiamo numeri, prima stampiamo il valore in testa alla coda, poi stampiamo il successivo, e così via.
In questo caso, se vogliamo eseguire un solo processo alla volta, usiamo Locks. Questo significa che il tempo bloccherà altri processi dall'eseguire codice simile. Dopo che il processo è completato, si rilascia il blocco.
from multiprocessing import Process, Lock def dispmay_name(l, i): l.acquire() print('Hi', i) l.release() if __name__ == '__main__': my_lock = Lock() my_name = ['Aadrika', 'Adwaita', 'Sakya', 'Sanj'] for name in my_name: Process(target=dispmay_name, args=(my_lock, name)).start()
Risultato di output
Hi Aadrika Hi Adwaita Hi Sakya Hi Sanj
Il modulo multi-processing fornisce anche un modulo di registrazione per garantire che i messaggi tra i processi non si mescolino durante l'esecuzione se il pacchetto di registrazione non utilizza la funzione di blocco.
import multiprocessing, logging logger = multiprocessing.log_to_stderr() logger.setLevel(logging.INFO) logger.warning('Error has occurred')
In questo esempio, prima si importano i moduli di registrazione e multi-processing, quindi si utilizza il metodo multiprocessing.log_to_stderr(). Poi si chiama get_logger() e si aggiunge a sys.stderr, infine si imposta il livello del registratore e si passa il messaggio.