Я как бы пытаюсь понять, что такое python для решения этой простой проблемы.
Моя проблема довольно проста. Если вы используете следующий код, он будет висеть. Это хорошо документировано в документе subprocess doc.
import subprocess
proc = subprocess.Popen(['cat','-'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
)
for i in range(100000):
proc.stdin.write('%d\n' % i)
output = proc.communicate()[0]
print output
Поиск решения (есть очень проницательный поток, но я потерял его сейчас). Я нашел это решение (среди прочих), которое использует явную fork:
import os
import sys
from subprocess import Popen, PIPE
def produce(to_sed):
for i in range(100000):
to_sed.write("%d\n" % i)
to_sed.flush()
#this would happen implicitly, anyway, but is here for the example
to_sed.close()
def consume(from_sed):
while 1:
res = from_sed.readline()
if not res:
sys.exit(0)
#sys.exit(proc.poll())
print 'received: ', [res]
def main():
proc = Popen(['cat','-'],stdin=PIPE,stdout=PIPE)
to_sed = proc.stdin
from_sed = proc.stdout
pid = os.fork()
if pid == 0 :
from_sed.close()
produce(to_sed)
return
else :
to_sed.close()
consume(from_sed)
if __name__ == '__main__':
main()
В то время как это решение концептуально очень легко понять, оно использует еще один процесс и задерживается как слишком низкий уровень по сравнению с модулем подпроцесса (это просто для того, чтобы скрыть такие вещи...).
Мне интересно: существует ли простое и чистое решение с использованием модуля подпроцесса, который не будет висели или для реализации этого теста. Мне нужно сделать шаг назад и реализовать цикл выбора в старом стиле или явный fork?
Спасибо