首页 > 解决方案 > 如果我在事件循环 asyncio 中启动一组要执行的任务,我可以分别对每个任务的返回做出反应吗?

问题描述

我想用 asyncio 启动 10 个操作系统子进程。例如,我可以通过收集来做到这一点,然后我可以在事件循环结束时找出每个任务的状态。但我必须等待整个事情完成。即使每个任务同时运行。有没有办法知道子流程 1 已经完成并对该事件做出反应,甚至在其他 9 个任务完成之前?

我正在使用 Python >3.7(3.8.6 和 3.9.1)。

也许我的问题应该是:一旦事件循环运行。有没有办法找出正在运行的任务的状态?

或者,期望任务本身在等待语句完成之后但在返回和离开事件循环之前执行任何工作的方式。

我会尝试这种方法。同时,这是我用于基本测试的代码:

我想要的示例:

import time


async def osrunner(cmd):
    proc = await asyncio.create_subprocess_shell(
          cmd,
          stdout=asyncio.subprocess.PIPE,
          stderr=asyncio.subprocess.PIPE)

    stdout, stderr = await proc.communicate()
    if stdout:
      print(f'[stdout]\n{stdout.decode()}')
    if stderr:
      print(f'[stderr]\n{stderr.decode()}')
    return True





async def main():

    cmd00='sleep 35'
    cmd01='sleep 15'
    cmd02='sleep 25'
    cmd03='sleep 5'

    task0 = asyncio.create_task( osrunner(cmd00) )
    task1 = asyncio.create_task( osrunner(cmd01) )
    task2 = asyncio.create_task( osrunner(cmd02) )
    task3 = asyncio.create_task( osrunner(cmd03) )


    await task0
    await task1
    await task2
    await task3



print(f"started main at {time.strftime('%X')}")
asyncio.run(main())               #<------------------I want to poll the status of the tasks and do something while the others are still unfinished
print(f"finished main  at {time.strftime('%X')}")

标签: subprocesspython-asyncio

解决方案


推荐阅读