subprocess - 如果我在事件循环 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')}")
解决方案
推荐阅读
- html - 如何使图像在重叠之前响应地调整到最大宽度?
- javascript - javaScript 检查字符串中至少一个字母数字字符
- r - 如何从简体中文网站上抓取内容?
- javascript - 用括号中的数字构建一个变量以进行循环
- html - 居中对齐一个元素,同时使用 flexbox 右对齐其唯一的同级元素
- python-3.x - 我在 python 中有两条类似的行,一条有效,但第二条有语法错误
- firebase - 如何在颤动(飞镖)中仅查询数组中的地图中的某些值?
- laravel - 如何在 laravel 进行查询
- ios - iOS UITextInput 控件:从硬件键盘接收前向删除键
- go - Panic runtime error while running Hello Couchbase application