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

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

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

foo()

我无法使这个简单的示例运行:

RuntimeWarning: coroutine 'foo' was never awaited foo()
2个解决方案
73 votes

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

import asyncio

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

要么

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

另请参阅asyncio.sleep()文档的“任务和协程”一章。 如果您已经在运行循环,则希望通过创建任务(Python 3.7+中的asyncio.sleep(),旧版本中的None)同时运行其他协程。

但是请注意asyncio.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()协程:

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

它与循环配合以使其他任务能够运行。 要阻止没有异步等效项的第三方库中的代码,可以在执行程序池中运行该代码。 请参阅asyncio开发指南中的运行阻止代码。

Martijn Pieters answered 2020-01-25T08:44:10Z
2 votes

如果已经有一个循环(与其他一些任务一起运行),则可以使用以下命令添加新任务:

asyncio.ensure_future(foo())

否则你可能会得到

The event loop is already running

错误。

lenooh answered 2020-01-25T08:44:38Z
translate from https://stackoverflow.com:/questions/32808893/how-to-use-async-await-in-python-3-5