【问题标题】:Asyncio coroutine never awaited errorAsyncio 协程从不等待错误
【发布时间】:2018-07-26 04:21:24
【问题描述】:

我无法解决和理解这里的问题。我正在使用一个示例来学习 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()

【问题讨论】:

  • 传递给gather时需要解压scripts:asyncio.gather(*scripts)
  • 感谢@dirn。现在可以使用了

标签: python python-asyncio coroutine


【解决方案1】:

正如@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 秒,因为它是异步运行的。

【讨论】:

  • 我会推荐subprocess.create_subprocess_exec('python', script)。如果脚本名称或它所在的目录包含空格,这将消除引用问题。
猜你喜欢
  • 2020-07-03
  • 2020-10-10
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多