¿Cómo usar async / await en Python 3.5?

#!/usr/bin/env python3 # -*- coding: utf-8 -*- import time async def foo(): await time.sleep(1) foo() 

No pude hacer este simple ejemplo muerto para ejecutar:

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

Correr coroutines requiere un bucle de eventos . Use la biblioteca asyncio() para crear una:

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

o

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

También vea el capítulo de Tareas y Coroutines de la documentación de asyncio . Si ya tiene un bucle en ejecución, desearía ejecutar corrutinas adicionales al mismo tiempo creando una tarea ( asyncio.create_task(...) en Python 3.7+, asyncio.ensure_future(...) en versiones anteriores).

Sin embargo, time.sleep() cuenta que time.sleep() no es un objeto que se puede esperar. Devuelve None así que obtienes una excepción después de 1 segundo:

 >>> asyncio.run(foo()) Traceback (most recent call last): File "", line 1, in  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 "", line 2, in foo TypeError: object NoneType can't be used in 'await' expression 

En este caso, deberías usar la asyncio.sleep() su lugar:

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

que es cooperar con el bucle para permitir que otras tareas se ejecuten. Para bloquear código de bibliotecas de terceros que no tienen equivalentes asyncio, puede ejecutar ese código en un grupo de ejecutores . Consulte Ejecutar código de locking en la guía de desarrollo de asyncio.

Si ya tiene un bucle en ejecución (con algunas otras tareas), puede agregar nuevas tareas con:

 asyncio.ensure_future(foo()) 

de lo contrario podría obtener

 The event loop is already running 

error.