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?