我有一个简单的 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
and 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
),使其按照您希望的方式运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)