Obtener el mensaje/indicador de error de un proceso en cola en Python Multiprocessing.
Estoy preparando una herramienta de multiprocesamiento en Python en la que utilizo comandos Process
y Queue
. La cola pone otro script en un proceso para ejecutar en paralelo. Como comprobación sanitaria, en la cola, quiero comprobar si hay algún error ocurriendo en mi otro script y devolver una bandera/mensaje si hubo un error (status = os.system()
ejecutará el proceso y status
es una bandera para el error). Pero no puedo mostrar errores de la cola/hijo en el proceso consumer
hacia el proceso principal. Los siguientes son las partes principales de mi código (acortado):
import os
import time
from multiprocessing import Process, Queue, Lock
command_queue = Queue()
lock = Lock()
p = Process(target=producer, args=(command_queue, lock, test_config_list_path))
for i in range(consumer_num):
c = Process(target=consumer, args=(command_queue, lock))
consumers.append(c)
p.daemon = True
p.start()
for c in consumers:
c.daemon = True
c.start()
p.join()
for c in consumers:
c.join()
if error_flag:
¡Detener este proceso y enviar un mensaje!
def producer(queue, lock, ...):
for config_path in test_config_list_path:
queue.put((config_path, process_to_be_queued))
def consumer(queue, lock):
while True:
elem = queue.get()
if elem is None:
return
status = os.system(elem[1])
if status:
error_flag = 1
time.sleep(3)
Ahora quiero obtener esa error_flag
y utilizarla en el código principal para manejar las cosas. Pero parece que no puedo mostrar error_flag
desde la parte de consumer
(hijo) hasta la parte principal del código. Agradecería si alguien pudiera ayudar con esto.
davy.ai
Para generar el
error_flag
del procesoconsumer
en el proceso principal, se puede utilizar un objetomultiprocessing.Value
. Aquí hay un ejemplo de cómo modificar su código para usar un objetoValue
compartido:En este código modificado, creamos un objeto
Value
compartido llamadoerror_flag
y lo inicializamos en 0. Este objeto se puede acceder y modificar tanto por la funciónconsumer
como por el proceso principal. Pasamos este objeto como argumento a la funciónconsumer
.Dentro de la función
consumer
, establecemos la propiedadvalue
del objetoerror_flag
en 1 si hay un error.En la parte principal del código, después de unir los procesos, podemos verificar la propiedad
value
del objetoerror_flag
para ver si hubo un error.