Asyncio协程永远不会等待错误

时间:2018-02-15 11:59:26

标签: python python-asyncio coroutine

我在这里修复和理解问题时遇到了麻烦。我使用示例来学习Asyncio,但我使用的代码与我的相似,但是我的错误消息说:

  

sys:1:RuntimeWarning:coroutine' run_script'从未等待过

请任何帮助将不胜感激。以下是我的代码

async def run_script(script):
    print("Run", script)
    await asyncio.sleep(1)
    os.system("python " + script)

我正在运行它

for script in os.listdir():
    if script.endswith(".py"):
        scripts.append(run_script(script))

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(scripts))
loop.close()

1 个答案:

答案 0 :(得分:5)

由于@dim提到了代码中的拼写错误,您还需要知道os.system正在同步运行,这意味着您文件夹中的脚本将按顺序运行,而不是以异步方式运行

要理解这一点,请添加名为 hello_world.py 的文件:

import time
time.sleep(2)
print('hello world')

如果按照以下方式运行脚本,则需要花费2s + 2s = 4s:

loop = asyncio.get_event_loop()
loop.run_until_complete(
    asyncio.gather(
        *[run_script('hello_world.py') for _ in range(2)]
    )
)

因此,要解决此问题,您可以使用asyncio.subprocess模块:

from asyncio import subprocess

async def run_script(script):
    process = await subprocess.create_subprocess_exec('python', script)
    try:
        out, err = await process.communicate()
    except Exception as err:
        print(err)

然后它只花费你2秒钟,因为它是异步运行的。