Asyncio coroutine never awaited error

混江龙づ霸主 提交于 2019-12-23 10:36:02

问题


I'm having trouble fixing and understanding the problem here. I'm using an example to learn Asyncio but the code I'm using is similar to mine but mine gives an error message saying:

sys:1: RuntimeWarning: coroutine 'run_script' was never awaited

Please any help will be greatly appreciated. Below is my code

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

and I'm running it like this

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:


As @dim mentioned what's the typo in your code, you also need to be aware os.system is running in synchronous, which means scripts in your folder will be run in sequence instead of in asynchronous way.

To understand that, add file called hello_world.py:

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

if you run you script as follows, it will cost you 2s + 2s = 4s:

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

So to solve this issue, you can use asyncio.subprocess module:

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)

Then it will cost you only 2 sec, because it is running asynchronously.



来源:https://stackoverflow.com/questions/48806760/asyncio-coroutine-never-awaited-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!