lee*_*ech 5 python python-asyncio
我有一个简单的python程序,我用它来测试子进程的asyncio:
import sys, time
for x in range(100):
print("processing (%s/100) " % x)
sys.stdout.flush()
print("enjoy")
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
在命令行上运行它会产生所需的结果.
但是,从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()
Run Code Online (Sandbox Code Playgroud)
ps ax显示这个过程<defunct>,不确定这意味着什么
dan*_*ano 10
我怀疑你的问题只是涉及到你是如何调用 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())
Run Code Online (Sandbox Code Playgroud)
您必须放置yield from在a内部使用的代码,asyncio.coroutine然后在事件循环(使用loop.run_until_complete)中调用它,以使其按照您希望的方式运行.