Proceso distribuido de proceso e hilo de Python

Notas de estudio de Python, registros especiales, compartir con ustedes, espero que sea de ayuda para todos.

Proceso distribuido

En Thread and Process, se debe preferir Process, porque Process es más estable y Process se puede distribuir a varias máquinas, mientras que Thread solo se puede distribuir a varias CPU de la misma máquina.

El módulo de multiprocesamiento de Python no solo admite múltiples procesos, sino que el submódulo de administradores también admite la distribución de múltiples procesos a múltiples máquinas. Un proceso de servicio puede actuar como un programador, distribuir tareas a muchos otros procesos y depender de la comunicación de la red. Debido a que el módulo de administradores está bien encapsulado, es fácil escribir programas multiproceso distribuidos sin conocer los detalles de la comunicación de red.

Por ejemplo: si ya tenemos un programa multiproceso que se comunica vía Queue ejecutándose en la misma máquina, ahora, debido a que el proceso de procesamiento de tareas es pesado, esperamos distribuir el proceso de envío de tareas y el proceso de procesamiento de tareas a dos Máquinas. ¿Cómo utilizar el proceso distribuido para lograrlo?

La Cola original puede seguir utilizándose, pero al exponer la Cola a través de la red a través del módulo de administradores, los procesos de otras máquinas pueden acceder a la Cola.

Veamos primero el proceso de servicio. El proceso de servicio es responsable de iniciar la cola, registrar la cola en la red y luego escribir tareas en la cola:

# task_master.py

import random, time, queue
from multiprocessing.managers import BaseManager

# 发送任务的队列:
task_queue = queue.Queue()
# 接收结果的队列:
result_queue = queue.Queue()

# 从BaseManager继承的QueueManager:
class QueueManager(BaseManager):
    pass

# 把两个Queue都注册到网络上, callable参数关联了Queue对象:
QueueManager.register('get_task_queue', callable=lambda: task_queue)
QueueManager.register('get_result_queue', callable=lambda: result_queue)
# 绑定端口5000, 设置验证码'abc':
manager = QueueManager(address=('', 5000), authkey=b'abc')
# 启动Queue:
manager.start()
# 获得通过网络访问的Queue对象:
task = manager.get_task_queue()
result = manager.get_result_queue()
# 放几个任务进去:
for i in range(10):
    n = random.randint(0, 10000)
    print('Put task %d...' % n)
    task.put(n)
# 从result队列读取结果:
print('Try get results...')
for i in range(10):
    r = result.get(timeout=10)
    print('Result: %s' % r)
# 关闭:
manager.shutdown()
print('master exit.')

Tenga en cuenta que cuando escribimos un programa multiproceso en una máquina, la Cola creada se puede usar directamente. Sin embargo, en un entorno multiproceso distribuido, agregar tareas a la Cola no puede operar directamente en la task_queue original. Omite la encapsulación de QueueManager y debe agregarse a través de la interfaz de cola obtenida por manager.get_task_queue ().

Luego, inicie el proceso de la tarea en otra máquina (también es posible comenzar en esta máquina):

# task_worker.py

import time, sys, queue
from multiprocessing.managers import BaseManager

# 创建类似的QueueManager:
class QueueManager(BaseManager):
    pass

# 由于这个QueueManager只从网络上获取Queue,所以注册时只提供名字:
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')

# 连接到服务器,也就是运行task_master.py的机器:
server_addr = '127.0.0.1'
print('Connect to server %s...' % server_addr)
# 端口和验证码注意保持与task_master.py设置的完全一致:
m = QueueManager(address=(server_addr, 5000), authkey=b'abc')
# 从网络连接:
m.connect()
# 获取Queue的对象:
task = m.get_task_queue()
result = m.get_result_queue()
# 从task队列取任务,并把结果写入result队列:
for i in range(10):
    try:
        n = task.get(timeout=1)
        print('run task %d * %d...' % (n, n))
        r = '%d * %d = %d' % (n, n, n*n)
        time.sleep(1)
        result.put(r)
    except Queue.Empty:
        print('task queue is empty.')
# 处理结束:
print('worker exit.')

El proceso de la tarea debe estar conectado al proceso de servicio a través de la red, por lo que se debe especificar la IP del proceso de servicio.

Ahora, puede probar el efecto de trabajo del proceso distribuido. Primero inicie el proceso de servicio task_master.py:

$ python3 task_master.py 
Put task 3411...
Put task 1605...
Put task 1398...
Put task 4729...
Put task 5300...
Put task 7471...
Put task 68...
Put task 4219...
Put task 339...
Put task 7866...
Try get results...

Una vez que el proceso task_master.py termina de enviar la tarea, comienza a esperar el resultado de la cola de resultados. Ahora inicie el proceso task_worker.py:

$ python3 task_worker.py
Connect to server 127.0.0.1...
run task 3411 * 3411...
run task 1605 * 1605...
run task 1398 * 1398...
run task 4729 * 4729...
run task 5300 * 5300...
run task 7471 * 7471...
run task 68 * 68...
run task 4219 * 4219...
run task 339 * 339...
run task 7866 * 7866...
worker exit.

El proceso task_worker.py finaliza y los resultados se seguirán imprimiendo en el proceso task_master.py:

Result: 3411 * 3411 = 11634921
Result: 1605 * 1605 = 2576025
Result: 1398 * 1398 = 1954404
Result: 4729 * 4729 = 22363441
Result: 5300 * 5300 = 28090000
Result: 7471 * 7471 = 55815841
Result: 68 * 68 = 4624
Result: 4219 * 4219 = 17799961
Result: 339 * 339 = 114921
Result: 7866 * 7866 = 61873956

¿Cuál es el uso de este sencillo modelo Maestro / Trabajador? De hecho, esta es una computación distribuida simple pero verdadera. Con una pequeña modificación del código y el inicio de varios trabajadores, las tareas se pueden distribuir a varias o incluso docenas de máquinas. Por ejemplo, el código para calcular n * n se puede reemplazar por envío de correos electrónicos., Se realiza el envío asincrónico de la cola de correo.

¿Dónde se almacenan los objetos de la cola? Tenga en cuenta que no hay código para crear una cola en task_worker.py, por lo que el objeto Queue se almacena en el proceso task_master.py:

La razón por la que se puede acceder a Queue a través de la red se logra a través de QueueManager. Dado que el QueueManager administra más de una cola, se debe dar un nombre a la interfaz de llamada de red de cada cola, como get_task_queue.

¿Cuál es el uso de authkey? Esto es para asegurar que las dos máquinas se comuniquen normalmente y no sean interferidas maliciosamente por otras máquinas. Si la clave de autenticación de task_worker.py es inconsistente con la clave de autenticación de task_master.py, definitivamente no podrá conectarse.

Bienvenido a prestar atención a la cuenta pública "Desarrollo web" , puede recibir la demostración de prueba de Python y los recursos de aprendizaje, todos aprenden Python juntos y recopilan los métodos del mundo, que es conveniente para usted y para mí desarrollar .

Espero poder ayudarlo. Si tiene alguna pregunta, puede unirse al grupo de intercambio técnico de QQ: 668562416
Si hay algo mal o insuficiente, también espero que los lectores puedan proporcionar más comentarios o sugerencias.
Si necesita reimprimir, por favor contáctame. Puedes reimprimir con autorización, gracias


Bienvenido a prestar atención a la cuenta pública "Desarrollo web"

imagen

Supongo que te gusta

Origin blog.csdn.net/qq_36478920/article/details/102387193
Recomendado
Clasificación