Deadlock bei der Protokollierung von Multiprozess- / Multithread-Python-Skripten

Ich stehe vor dem Problem, Protokolle aus dem folgenden Skript zu sammeln. Sobald ich das eingerichtet habeSLEEP_TIME Auf einen zu "kleinen" Wert blockieren die LoggingThread-Threads das Protokollierungsmodul. Das Skript friert bei Protokollierungsanforderung im einaction Funktion. Wenn dasSLEEP_TIME Gegen 0.1 Uhr sammelt das Skript alle Logmeldungen wie ich es erwarte.

Ich habe versucht zu folgendiese Antwort aber es löst mein problem nicht.

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')

Wie verwende ich das Protokollierungsmodul in Multiprozess- und Multithread-Skripten?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage