【问题标题】:Python Asyncio subprocess never finishesPython Asyncio 子进程永远不会完成
【发布时间】:2014-07-02 21:18:05
【问题描述】:

我有一个简单的 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>,不知道是什么意思

【问题讨论】:

  • 你写的不是有效的python代码。

标签: python python-asyncio


【解决方案1】:

我怀疑您的问题仅与您调用asyncio.create_subprocess_execprocess.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),让它按照您希望的方式运行。

【讨论】:

    猜你喜欢
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多