How to use async/await in Python 3.5?

后端 未结 2 2026
太阳男子
太阳男子 2020-12-24 05:16
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time

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

foo()

I couldn\'t make this dead simple example

相关标签:
2条回答
  • 2020-12-24 05:34

    If you already have a loop running (with some other tasks), you can add new tasks with:

    asyncio.ensure_future(foo())
    

    otherwise you might get

    The event loop is already running
    

    error.

    0 讨论(0)
  • 2020-12-24 05:47

    Running coroutines requires an event loop. Use the asyncio() library to create one:

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

    or

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

    Also see the Tasks and Coroutines chapter of the asyncio documentation. If you already have a loop running, you'd want to run additional coroutines concurrently by creating a task (asyncio.create_task(...) in Python 3.7+, asyncio.ensure_future(...) in older versions).

    Note however that time.sleep() is not an awaitable object. It returns None so you get an exception after 1 second:

    >>> 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
    

    In this case you should use the asyncio.sleep() coroutine instead:

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

    which is cooperates with the loop to enable other tasks to run. For blocking code from third-party libraries that do not have asyncio equivalents, you could run that code in an executor pool. See Running Blocking Code in the asyncio development guide.

    0 讨论(0)
提交回复
热议问题