Запуск конвейерных подпроцессов дает другой результат при изменении порядка запуска? - PullRequest
1 голос
/ 27 августа 2010

Я запускаю поток команд из программы на python3, используя subprocess.*; Я не хотела проходить через оболочку, поскольку я передаю аргументы своим подкомандам и проверяю, что оболочка не будет неверно их интерпретировать, было бы кошмаром.

В документе subprocess приведен пример того, как это сделать:

p1 = Popen(command1, stdout=PIPE)
p2 = Popen(command2, stdin=p1.stdout)
p2.wait()
p1.wait()

Это хорошо работает. Тем не менее, я задавался вопросом, будет ли безопаснее начать потребителя до производителя, поэтому

p2 = Popen(command2, stdin=PIPE)
p1 = Popen(command1, stdout=p2.stdin)
p2.wait()
p1.wait()

Я ожидал, что это будет вести себя точно так же, но, видимо, это не так. Первый код работает без нареканий; во-вторых, моя программа зависает; Если я посмотрю на систему, то увижу, что p1 мертв и ждет, когда его пожнут, а p2 зависнет навсегда. Есть ли рациональное объяснение этому?

1 Ответ

1 голос
/ 27 августа 2010

Похоже, что p2 (потребитель) зависает, потому что его stdin остается открытым.Если код изменяется следующим образом, оба процесса завершаются успешно:

p2 = Popen(command2, stdin=PIPE)
p1 = Popen(command1, stdout=p2.stdin)
p1.wait()
p2.stdin.close()
p2.wait()

Могу поспорить, что это закон утечек в действии.

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