Из моей основной программы Python я создаю дочернюю программу с этим кодом:
child = subprocess.Popen(..., stdout=subprocess.PIPE, stdin=subprocess.PIPE)
FWIW, дочерний элемент - это PHP-скрипт, который должен обмениваться данными с программой на python.
Мастер-программе Python на самом деле нужно прослушивать связь из нескольких других каналов - другие PHP-скрипты, порожденные с использованием того же кода, или объекты сокетов, полученные из socket.accept()
, и я хотел бы использовать select.select()
, так как это наиболее эффективный способ ожидания ввода от различных источников.
Проблема, с которой я столкнулся, заключается в том, что select.select()
под Windows не работает с дескриптором файла stdout подпроцесса (это задокументировано), и, похоже, я буду вынужден:
- A) Опрос PHP-скриптов, чтобы увидеть, написали ли они что-нибудь для stdout. (Эта система должна быть очень отзывчивой, мне нужно опрашивать не менее 1000 раз в секунду!)
- B) Подключите сценарии PHP к главному процессу и обменивайтесь данными через сокеты вместо stdout / stdin.
Я, вероятно, пойду с решением (B), потому что я не могу заставить себя проводить системный опрос с такой высокой частотой, но кажется грустной тратой ресурсов на повторное соединение с сокетами, когда stdout / stdin сделал бы просто отлично.
Есть ли альтернативное решение, которое позволило бы мне использовать стандартный вывод и select.select()
?