Ответ 1
Не похоже, что появится реальное решение (т.е. альтернативная реализация подпроцесса, использующего vfork). Так как насчет симпатичного взлома? В начале вашего процесса создайте ведомое устройство, которое висит вокруг с небольшим размером памяти, готовым к появлению ваших подпроцессов и поддерживая открытую связь с ним на протяжении всего жизненного цикла основного процесса.
Вот пример использования rfoo (http://code.google.com/p/rfoo/) с именованным сокетом unix, называемым rfoosocket (вы, очевидно, могли бы использовать другие типы соединений, поддерживающие rfoo, или другая библиотека RPC):
Сервер:
import rfoo
import subprocess
class MyHandler(rfoo.BaseHandler):
def RPopen(self, cmd):
c = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
c.wait()
return c.stdout.read()
rfoo.UnixServer(MyHandler).start('rfoosocket')
Клиент:
import rfoo
# Waste a bunch of memory before spawning the child. Swap out the RPC below
# for a straight popen to show it otherwise fails. Tweak to suit your
# available system memory.
mem = [x for x in range(100000000)]
c = rfoo.UnixConnection().connect('rfoosocket')
print rfoo.Proxy(c).RPopen('ls -l')
Если вам требуется взаимодействие в реальном времени с обратным и четвертым взаимодействием с вашими нерешенными подпроцессами, эта модель, вероятно, не сработает, но вы можете ее взломать. Предположительно вы хотите очистить доступные аргументы, которые могут быть переданы Popen на основе ваших конкретных потребностей, но это должно быть относительно простым.
Вы также должны просто запустить сервер в начале работы клиента и управлять файлом сокета (или портом), который будет очищен при выходе.