我有一个简单的 python 程序,我用它来测试带有子进程的 asyncio:
import sys, time
for x in range(100):
print("processing (%s/100) " % x)
sys.stdout.flush()
print("enjoy")
sys.stdout.flush()
在命令行上运行它会产生所需的结果。
但是,当从 asyncio 调用时,它永远不会完成
process = yield from asyncio.create_subprocess_exec(
*["python", "program.py"],
stdout=async_subprocess.PIPE,
stderr=async_subprocess.STDOUT,
cwd=working_dir
)
# this never finishes
yield from process.communicate()
ps ax
显示这个过程是<defunct>
, 不知道那是什么意思
最佳答案
我怀疑您的问题与您调用 asyncio.create_subprocess_exec
和 process.communiate()
的方式有关。这个完整的例子对我来说很好用:
import asyncio
from asyncio import subprocess
@asyncio.coroutine
def do_work():
process = yield from asyncio.create_subprocess_exec(
*["python", "program.py"],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT
)
stdout, _= yield from process.communicate()
print(stdout)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(do_work())
您必须将使用 yield from
的代码放在 asyncio.coroutine
中,然后在事件循环中调用它(使用 loop.run_until_complete
),使其按照您希望的方式运行。
关于Python Asyncio 子进程永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24541192/