Почему запуск цикла событий asyncio в другом потоке мешает моей трубе?

#python #subprocess #python-asyncio

Вопрос:

У меня есть 2 процесса. Я хотел write.py бы написать сообщение read.py через канал Linux.

 ### write.py import subprocess import asyncio from threading import Thread  # !-- Offending code here. --! # loop = asyncio.new_event_loop() # def side_thread(loop): # asyncio.set_event_loop(loop) # loop.run_forever() # thread = Thread(target=side_thread, args=(loop,)) # thread.start()  notify_proc = subprocess.Popen("python read.py".split(), stdin=subprocess.PIPE)  notify_proc.stdin.write("hellon".encode("utf-8"))  
 ### read.py import sys  for line in sys.stdin:  print("Got something!")  print(line)  

Как указано, когда я запускаю python write.py , я получаю ожидаемый результат:

 Got something! hello  

Но когда я раскомментирую код-нарушитель, я не получаю никаких выходных данных. Почему?

  • Python 3.9.7
  • Linux 5.4.72-microsoft-стандарт-WSL2 x86_64

Ответ №1:

Ваш буфер не будет отправлен до тех пор, пока буфер не будет очищен или процесс не завершится, и процесс не завершится до тех пор, пока не будет запущен поток, не являющийся демоном. В краткосрочной перспективе вы можете добавить notify_proc.stdin.flush() , но ваше смешение многопроцессорной обработки , потоковой обработки и асинхронности приведет к слезам. Что, черт возьми, ты пытаешься здесь сделать?