English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
多处理程序包支持生成过程。它是指加载和执行新的子进程的函数。为了让孩子终止或继续执行并发计算,则当前进程必须使用类似于线程模块的API等待。
当我们使用Multiprocessing时,首先要创建过程对象。然后,它调用一个start()
方法。
from multiprocessing import Process def display(): print('Hi !! I am Python') if __name__ == '__main__': p = Process(target=display) p.start() p.join()
在此示例中,首先我们导入Process类,然后使用该display()
函数启动Process对象。
然后,用start()
方法开始处理,然后用该join()
方法完成处理。
我们还可以使用args关键字将参数传递给函数。
from multiprocessing import Process def display(my_name): print('Hi !!!') + " " + my_name) if __name__ == '__main__': p = Process(target=display, args=('Python',)) p.start() p.join()
在此示例中,我们创建一个过程,该过程计算数字的立方并将所有结果打印到控制台。
from multiprocessing import Process def cube(x): for x in my_numbers: print('%s cubo es %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 print ("Done")
Resultados de la salida
Done 3 el cubo es 27 4 el cubo es 64 5 el cubo es 125 6 el cubo es 216 7 el cubo es 343 8 el cubo es 512
我们也可以一次创建多个流程。
在此示例中,首先我们创建一个进程,即process1,该进程仅计算一个数字的立方,与此同时,第二个进程process2正在检查该数字是偶数还是奇数。
from multiprocessing import Process def cube(x): for x in my_numbers: print('%s cubo es %s' % (x, x**3)) def evenno(x): for x in my_numbers: if x % 2 == 0: print('%s es un número par' % (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() print ("Done")
Resultados de la salida
3 el cubo es 27 4 el cubo es 64 5 el cubo es 125 6 el cubo es 216 7 el cubo es 343 8 el cubo es 512 4 es un número par 6 es un número par 8 es un número par Done
El procesamiento múltiple admite tuberías y colas, que son dos canales de comunicación entre procesos.
En el procesamiento múltiple, cuando queremos comunicarnos entre procesos, en este caso usamosTubería。
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()
Resultados de la salida
['hi !!! I am Python']
La tubería devuelve dos objetos conexión, que representan los dos extremos de la tubería. Cada objeto conexión tiene dos métodossend()
,一种是recv()
Método, otra es método.
En este ejemplo, primero creamos un proceso que imprime el mensaje " hi !! I am Python", luego compartimos datos.
Cuando pasamos datos entre procesos, en ese momento podemos usar el objeto 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())
Resultados de la salida
0 2 4 6 8
En este ejemplo, primero creamos una función que verifica si el clima es par. Si el número es par, se inserta al final de la cola. Luego, creamos un objeto cola y un objeto flujo, y luego iniciamos el flujo.
Finalmente, verificamos si la cola está vacía.
Cuando imprimimos números, primero imprimimos el valor que está en la cabeza de la cola, luego imprimimos el siguiente, y así sucesivamente.
En este caso, si queremos que solo se ejecute un proceso a la vez, utilizamos Locks. Esto significa que el tiempo evitará que otros procesos ejecuten código similar. Después de que este proceso se complete, se liberará el bloqueo.
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()
Resultados de la salida
Hi Aadrika Hi Adwaita Hi Sakya Hi Sanj
El módulo de multi-procesamiento también proporciona un módulo de registro para asegurar que si el paquete de registro no utiliza la función de bloqueo, los mensajes entre los procesos se mezclarán durante la ejecución.
import multiprocessing, logging logger = multiprocessing.log_to_stderr() logger.setLevel(logging.INFO) logger.warning('Error ha ocurrido')
En este ejemplo, primero se importan los módulos de registro y multi-procesamiento, luego se utiliza el método multiprocessing.log_to_stderr(). Luego se llama a get_logger() y se agrega a sys.stderr, finalmente configuramos el nivel del registrador y pasamos el mensaje.