#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time
async def foo():
await time.sleep(1)
foo()
Я не мог сделать этот мертвый простой пример для запуска:
RuntimeWarning: coroutine 'foo' was never awaited foo()
#!/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())
Также см. Главу "Задачи и сопрограммы" документации asyncio
. Если у вас уже запущен цикл, вам нужно запустить дополнительные сопрограммы одновременно, создав задачу (asyncio.create_task(...)
в 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()
:
async def foo():
await asyncio.sleep(1)
которая взаимодействует с циклом для запуска других задач. Для блокировки кода из сторонних библиотек, не имеющих асинхронных эквивалентов, вы можете запустить этот код в пуле исполнителей. См. Запуск кода блокировки в руководстве по разработке asyncio.
Если у вас уже запущен цикл (с некоторыми другими задачами), вы можете добавить новые задачи с помощью:
asyncio.ensure_future(foo())
в противном случае вы можете получить
The event loop is already running
ошибка.