Punto muerto con el registro multiprocesamiento / multithread script de python

Estoy enfrentando el problema con la recostackción de registros de la siguiente secuencia de comandos. Una vez que configuro SLEEP_TIME a un valor demasiado “pequeño”, los hilos LoggingThread de alguna manera bloquean el módulo de registro. La secuencia de comandos se congela en la solicitud de registro en la función de action . Si el SLEEP_TIME es aproximadamente 0.1, el script recostackrá todos los mensajes de registro como esperaba.

Intenté seguir esta respuesta pero no resuelve mi problema.

 import multiprocessing import threading import logging import time SLEEP_TIME = 0.000001 logger = logging.getLogger() ch = logging.StreamHandler() ch.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(funcName)s(): %(message)s')) ch.setLevel(logging.DEBUG) logger.setLevel(logging.DEBUG) logger.addHandler(ch) class LoggingThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): while True: logger.debug('LoggingThread: {}'.format(self)) time.sleep(SLEEP_TIME) def action(i): logger.debug('action: {}'.format(i)) def do_parallel_job(): processes = multiprocessing.cpu_count() pool = multiprocessing.Pool(processes=processes) for i in range(20): pool.apply_async(action, args=(i,)) pool.close() pool.join() if __name__ == '__main__': logger.debug('START') # # multithread part # for _ in range(10): lt = LoggingThread() lt.setDaemon(True) lt.start() # # multiprocess part # do_parallel_job() logger.debug('FINISH') 

¿Cómo utilizar el módulo de registro en scripts multiproceso y multiproceso?

Este es probablemente el error 6721 .

El problema es común en cualquier situación en la que tenga lockings, hilos y horquillas. Si el hilo 1 tenía un locking, mientras que el hilo 2 llama a la bifurcación, en el proceso bifurcado, solo habrá un hilo 2 y el locking se mantendrá para siempre. En su caso, eso es logging.StreamHandler.lock .

Una solución se puede encontrar aquí para el módulo de logging . Tenga en cuenta que también debe cuidar cualquier otro locking.