¿Debo usar dos bucles de eventos asyncio en un progtwig?

Quiero usar el módulo asyncio Python 3 para crear una aplicación de servidor. Utilizo un bucle de eventos principal para escuchar la red, y cuando se reciben nuevos datos hará un cálculo y enviará el resultado al cliente. ¿Necesita ‘hacer algún cálculo’ un nuevo bucle de eventos? ¿O puede usar el bucle del evento principal?

Puede realizar el trabajo de cálculo en el bucle de eventos principal, pero todo el ciclo de eventos se bloqueará mientras eso sucede; no se pueden atender otras solicitudes, y se bloqueará cualquier otra cosa que esté ejecutando en el ciclo de eventos. Si esto no es aceptable, es probable que desee ejecutar el trabajo de proceso en un proceso separado, utilizando BaseEventLoop.run_in_executor . Aquí hay un ejemplo muy simple que lo demuestra:

 import time import asyncio from concurrent.futures import ProcessPoolExecutor def cpu_bound_worker(x, y): print("in worker") time.sleep(3) return x +y @asyncio.coroutine def some_coroutine(): yield from asyncio.sleep(1) print("done with coro") @asyncio.coroutine def main(): loop = asyncio.get_event_loop() loop.set_default_executor(ProcessPoolExecutor()) asyncio.async(some_coroutine()) out = yield from loop.run_in_executor(None, cpu_bound_worker, 3, 4) print("got {}".format(out)) loop = asyncio.get_event_loop() loop.run_until_complete(main()) 

Salida:

 in worker done with coro got 7 

cpu_bound_worker se ejecuta en un proceso hijo, y el bucle de eventos esperará el resultado como lo haría con cualquier otra operación de E / S no bloqueadora, por lo que no bloquea la ejecución de otras corrutinas.