Я пытаюсь обработать журнал подпроцесса в режиме реального времени, после проведения некоторых исследований в Интернете, я реализовал версию с многопоточностью Python и очередью, но я все еще сталкиваюсь с проблемой взаимоблокировки с каким-то специальным подпроцессом. Кто-нибудь знает почему?
process = subprocess.Popen(subprocess_cmd_to_run, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stderr_queue = Queue(maxsize=1000)
stderr_enqueue_thread = Thread(target=enqueue_output, args=(process.stderr, stderr_queue))
stderr_enqueue_thread.daemon = True
stderr_euqueue_thread.start()
stdout_queue = Queue(maxsize=1000)
stdout_enqueue_thread = Thread(target=enqueue_output, args=(process.stdout, stdout_queue))
stdout_enqueue_thread.daemon = True
stdout_euqueue_thread.start()
stderr_consumer_thread = Thread(target=consume_output, args=(stderr_queue))
stderr_consumer_thread.daemon = True
stderr_consumer_thread.start()
stdout_consumer_thread = Thread(target=consume_output, args=(stdout_queue))
stdout_consumer_thread.daemon = True
stdout_consumer_thread.start()
stderr_enqueue_thread.join()
stdout_euqueue_thread.join()
stderr_queue.join()
stdout_queue.join()
return_code = process.wait()
def enqueue_output(out, queue):
for line in out:
if line:
decoded_line = line.decode("utf-8")
try:
queue.put_nowait(decoded_line)
except Full:
pass
out.close()
def consume_output(queue):
while True:
line.queue.get()
# do something
queue.task_done()