python - 如何在 Python 3.5 中使用 async/await?

标签 python python-3.x async-await coroutine python-3.5

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time

async def foo():
  await time.sleep(1)

foo()

我无法让这个死气沉沉的简单示例运行:

RuntimeWarning: coroutine 'foo' was never awaited foo()

最佳答案

运行协程需要一个事件循环。使用 asyncio() library创建一个:

import asyncio

# Python 3.7+
asyncio.run(foo())

# Python 3.6 and older
loop = asyncio.get_event_loop()
loop.run_until_complete(foo())

另见 Tasks and Coroutines chapter of the asyncio documentation .如果您已经有一个循环正在运行,您可能希望通过创建一个任务(asyncio.create_task(...) in Python 3.7+,asyncio.ensure_future(. ..) 在旧版本中)。

但请注意,time.sleep() 不是 可等待对象。它返回 None 所以你会在 1 秒后得到一个异常:

>>> asyncio.run(foo())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/.../lib/python3.7/asyncio/runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "/.../lib/python3.7/asyncio/base_events.py", line 573, in run_until_complete
    return future.result()
  File "<stdin>", line 2, in foo
TypeError: object NoneType can't be used in 'await' expression

在这种情况下,您应该使用 asyncio.sleep() coroutine而是:

async def foo():
    await asyncio.sleep(1)

它与循环配合以使其他任务能够运行。要阻止来自没有 asyncio 等效项的第三方库中的代码,您可以在 executor pool 中运行该代码。 .见 Running Blocking Code在 asyncio 开发指南中。

关于python - 如何在 Python 3.5 中使用 async/await?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32808893/

相关文章:

c# - 如何在控制台应用程序中从 Task.WaitAll() 获取返回值?

python - VS Code 终端中的光标错误

python-3.x - 模拟 : Client does not have the attribute 'get_object'

arrays - Python '==' 运算符给出了错误的结果

python - 将 pandas 数据帧作为参数传递给 python subprocess.Popen

c# - 等待异步方法而不阻塞线程

c# - 如何返回 Task<int>?

python - 使用Python保存到excel时如何在pd.read_html()中分隔多个数据帧

python - 在 virtualenv 中通过 pip 安装 PyGObject

python - Keys won't register (pygame) - 我确信 pygame 直接坏了