Потоковая передача Python std (in / out / err) другому процессу - PullRequest
3 голосов
/ 19 августа 2011

У меня есть процесс 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) для эффективной потоковой передачи, лучше всего сделать это на клиенте.

1 Ответ

1 голос
/ 24 августа 2011

Я не совсем уверен, что понимаю вопрос, но вы изучили , используя select с pipe / sockets , чтобы избежать блокировки? Я немного расплывчат в другом требовании, чтобы оно «не читалось в память».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...