Red de conocimiento informático - Problemas con los teléfonos móviles - Los obstáculos que encontrará en los procesos distribuidos de Python

Los obstáculos que encontrará en los procesos distribuidos de Python

Escrito al frente

Sin complicaciones

¿Estás usando Python3 o programando en un sistema Windows? ¿Lo más importante es que no tienes muy claros los procesos y subprocesos? Felicitaciones, en el proceso distribuido de Python, habrá pozos esperando que los cave. . . (jajajaja, permíteme asustarte aquí) Es broma, pero si sabes que las funciones anónimas no son compatibles con las secuencias, entonces te diremos adiós a este problema. Bien, sin más preámbulos, vayamos directo al grano.

Proceso distribuido

Como todos sabemos, Process es más estable que Thread y Process se puede distribuir a varias máquinas, mientras que Thread solo se puede distribuir a varias máquinas en la misma máquina. como máximo en una CPU. 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, distribuyendo tareas a muchos otros procesos, basándose en la comunicación de la red. Dado que el módulo de administradores está bien encapsulado, puede escribir fácilmente programas multiproceso distribuidos sin conocer los detalles de la comunicación de la red.

Registro de Código

Por ejemplo

Si ya tenemos un programa multiproceso ejecutándose en la misma máquina que se comunica a través de Cola, ahora, por tareas de procesamiento El proceso tiene tareas pesadas y espero distribuir el proceso de envío de tareas y el proceso de procesamiento de tareas a dos máquinas. ¿Cómo se debe lograr esto utilizando procesos distribuidos? Ya sabe que la cola original se puede seguir utilizando y, al exponer la cola a través de la red a través del módulo de administradores, los procesos en otras máquinas pueden acceder a la cola. Bien, ¡hagamos esto!

Escribe task_master.py

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.

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 se puede usar directamente. Se opera el task_queue original, que omite la encapsulación de QueueManager y debe agregarse a través de la interfaz Queue obtenida por manager.get_task_queue (). Luego, inicie el proceso de la tarea en otra máquina (también puede iniciarlo en la máquina local)

Escriba un task_worker.py

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

Resultados de la ejecución

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

Después de que el proceso task_master.py envía la tarea, comienza a esperar los resultados de la cola de resultados. Ahora inicie el proceso task_worker.py:

Mira, todos los resultados son incorrectos. Analicemos qué salió mal. . .

Análisis de errores

En el mensaje de error de task_master.py, sabemos que dice error lambda. Esto se debe a que la serialización no admite funciones anónimas, por lo que tenemos que modificar el código. y reajustarla. La cola se encapsula usando QueueManager y se coloca en la red.

Entre ellas, task_queue y result_queue son dos colas que almacenan tareas y resultados respectivamente. Se utilizan para la comunicación entre procesos y el intercambio de objetos.

Debido a que es un entorno distribuido, los datos colocados en la cola deben esperar a que la máquina de los trabajadores se procese antes de leerlos. De esta manera, la cola debe encapsularse con QueueManager y colocarse en la red. Esto se hace a través de las 2 líneas de código anteriores para lograrlo.

Le asignamos a la interfaz de llamada de red de return_task_queue el nombre get_task_queue, y el nombre de return_result_queue es get_result_queue, lo que facilita distinguir en qué cola se está operando. task.put (n) es escribir datos en task_queue, lo que equivale a asignar tareas. Y result.get() es el resultado devuelto después de esperar a que las máquinas trabajadoras lo procesen.

Cabe destacar que debes escribir la dirección IP en el sistema Windows, pero no en otros sistemas operativos como los sistemas operativos Linux.

Código modificado

Modificar de la siguiente manera en task_master.py:

Modificar de la siguiente manera en task_worker.py:

Ejecutar primero task_master. py y luego ejecute task_worker.py

(1) Los resultados de ejecución de task_master.py son los siguientes

(2) Los resultados de ejecución de task_worker.py son los siguientes

Suplemento de conocimientos

¿Para qué sirve este modelo simple Maestro/Trabajador? De hecho, se trata de una computación simple pero verdaderamente distribuida. Modificando ligeramente el código e iniciando a 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 enviando. emails., realizando el envío asincrónico de colas de correo.

¿Dónde se almacena el objeto 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 la cola a través de la red es a través de QueueManager. Dado que QueueManager administra más de una cola, es necesario asignar un nombre a la interfaz de llamada de red de cada cola, como get_task_queue. El nombre registrado del QueueManager aquí en task_worker debe ser el mismo que el de task_manager. Comparando el ejemplo anterior, podemos ver que el objeto Cola pasa desde otro proceso a través de la red. Es solo que QueueManager completa la entrega y la comunicación de red aquí.

¿Para qué sirve la clave de autenticación? Esto es para garantizar 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 no coincide con la clave de autenticación de task_master.py, la conexión definitivamente fallará.