English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Procesamiento multiplataforma en Python

多处理程序包支持生成过程。它是指加载和执行新的子进程的函数。为了让孩子终止或继续执行并发计算,则当前进程必须使用类似于线程模块的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关键字将参数传递给函数。

Ejemplo

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正在检查该数字是偶数还是奇数。

Ejemplo

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

Comunicación entre flujos

El procesamiento múltiple admite tuberías y colas, que son dos canales de comunicación entre procesos.

Tubo

En el procesamiento múltiple, cuando queremos comunicarnos entre procesos, en este caso usamosTubería

Ejemplo

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.

s列

Cuando pasamos datos entre procesos, en ese momento podemos usar el objeto Queue.

Ejemplo

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.

Dispositivos

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.

Ejemplo de uso de métodos de Locks

Ejemplo

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

Registro

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.

Ejemplo

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.