programming - ¿Se puede ejecutar un bucle de eventos asyncio en segundo plano sin suspender el intérprete de Python?
python async task (1)
Puede ejecutar el bucle de eventos dentro de un hilo de fondo:
>>> import asyncio
>>>
>>> @asyncio.coroutine
... def greet_every_two_seconds():
... while True:
... print(''Hello World'')
... yield from asyncio.sleep(2)
...
>>> def loop_in_thread(loop):
... asyncio.set_event_loop(loop)
... loop.run_until_complete(greet_every_two_seconds())
...
>>>
>>> loop = asyncio.get_event_loop()
>>> import threading
>>> t = threading.Thread(target=loop_in_thread, args=(loop,))
>>> t.start()
Hello World
>>>
>>> Hello World
Tenga en cuenta que debe llamar a asyncio.set_event_loop
en el loop
, de lo contrario obtendrá un error que dice que el subproceso actual no tiene un bucle de eventos.
Si desea interactuar con el bucle de eventos desde el hilo principal, deberá atenerse a loop.call_soon_threadsafe
llamadas loop.call_soon_threadsafe
.
Si bien este tipo de cosas es una buena forma de experimentar en el intérprete, en los programas reales, probablemente querrá que todo su código se ejecute dentro del bucle de eventos, en lugar de introducir hilos.
La documentación de asyncio da dos ejemplos de cómo imprimir "Hola mundo" cada dos segundos: https://docs.python.org/3/library/asyncio-eventloop.html#asyncio-hello-world-callback https://docs.python.org/3/library/asyncio-task.html#asyncio-hello-world-coroutine
Los puedo ejecutar desde el intérprete, pero si lo hago, pierdo el acceso al intérprete. ¿Se puede ejecutar un bucle de eventos asyncio en segundo plano, para que pueda seguir escribiendo comandos en el intérprete?