У меня есть процесс Python, работающий "в фоновом режиме". Это вызов subprocess.Popen () , запущенный в совершенно другом процессе. Как я уже реализовал, два процесса используют multiprocessing.connections. (Listener | Client) для связи друг с другом. Но я открыт для любого способа достичь следующего.
Я хочу, чтобы фоновый процесс «слушателя» использовал std (in | out | err), как если бы он пришел из процесса «клиента». Потоковая передача важна для того, чтобы io не считывался в память, а считывался и записывался эффективно, но также во избежание блокирования процесса слушателя. Я предполагаю, что это означает, что мне нужен доступ более низкого уровня или какое-то асинхронное / многопоточное решение. Вот что мне непонятно как делать. Например:
while True: # TODO
conn = listener.accept()
try:
callable_, args, kw = conn.recv()
callable_(*args, **kw)
Вопрос в том, как позволить callable_ эффективно выполнять потоковую передачу на / из std (in | out | err) и без блокировки. Слушатель также долго работает, и я пытаюсь поддержать произвольный код Python, который выполняет from sys import std(in|out|err)
во время импорта модуля слушателя, все равно будет видеть std (in | out | err), как будто от клиента. Я могу выполнить настройку (изменить / заменить sys.std (in | out | err)?) При запуске слушателя, прежде чем что-либо еще будет добавлено.
Есть ли хороший способ прозрачной потоковой передачи этого ввода-вывода, чтобы после начальной настройки код, выполняемый процессом слушателя, мог быть произвольным и нормально обрабатывать std (in | out | err) без блокировки и т. Д.? Желательно без создания новых процессов, поскольку цель состоит в том, чтобы уменьшить издержки процесса, хотя использование нескольких процессов на стороне клиента является предпочтительным, поскольку клиент тонкий. Точно так же, если мне нужно выполнить циклы чтения / записи сегментов байтов из std (in | out | err) для эффективной потоковой передачи, лучше всего сделать это на клиенте.