python教程—如何在Python 3.5中使用async/ wait ?-Python实用宝典

python教程—如何在Python 3.5中使用async/ wait ?

我不能让这个非常简单的例子运行:运行协程需要一个事件循环。使用asyncio()库创建一个:
    #!/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()库创建一个:

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

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

还请参阅异步文档中的任务和协作程序。如果您已经运行了一个循环,那么您可能希望通过在Python 3.7+中创建一个任务(asyncio.create_task(…),在旧版本中创建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)

它与循环协作,使其他任务能够运行。要阻止来自没有异步等价物的第三方的代码,可以在执行器池中运行该代码。参见Running block Code in the asyncio development guide。

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
1

发表评论