Python Asyncio 子进程永远不会完成

标签 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()

在命令行上运行它会产生所需的结果。

但是,当从 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_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),使其按照您希望的方式运行。

关于Python Asyncio 子进程永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24541192/

相关文章:

python - 使用 Flask - Python 下载 ReportLab PDF

python - 将 pandas 系列从 str 转换为 float 时,是否有一种方法可以跳过不可转换的行?

python - 使用 Flask,我如何将 robots.txt 和 sitemap.xml 作为静态文件提供?

python - 在python中将字符串转换为日期的快速方法

python - Jupyter 中的 "ImportError: No module named ' jwt '"

python-3.x - 为什么我的进程列表在运行 aiohttp 时显示多个线程?

Python 异步 : unreferenced tasks are destroyed by garbage collector?

python - 测试是否等待协程

python - 从正在运行的线程调用其他线程上的协程

python - 使用 Django Channels 和 pytest-asyncio 测试消费者方法是否可以引发异常