Tengo un hilo que llama bucles asyncio, sin embargo, esto provoca la excepción mencionada:
RuntimeError: There is no current event loop in thread 'Thread-1'.Esta pregunta: RuntimeError: No hay un bucle de eventos actual en el subproceso en async + apscheduler se encontró con el mismo problema, sin embargo, se refirieron a un programador que no tengo.
Mi código es el siguiente:
def worker(ws): l1 = asyncio.get_event_loop() l1.run_until_complete(ws.start()) l2 = asyncio.get_event_loop() l2.run_forever() if __name__ == '__main__': ws = Server() p = threading.Thread(target=worker,args=(ws,)) p.start() while True: try: #...do sth except KeyboardInterrupt: p.join() exit()El nuevo hilo no tiene un bucle de eventos, por lo que debe pasarlo y configurarlo explícitamente:
def worker(ws, loop): asyncio.set_event_loop(loop) loop.run_until_complete(ws.start()) if __name__ == '__main__': ws = Server() loop = asyncio.new_event_loop() p = threading.Thread(target=worker, args=(ws, loop,)) p.start() Además, p.join() no terminará su secuencia de comandos correctamente ya que nunca detiene el servidor, por lo que su ciclo continuará ejecutándose, presumiblemente colgando el hilo. Debe llamar a algo como loop.call_soon_threadsafe(ws.shutdown) antes de unirse al hilo, idealmente esperando el apagado correcto del servidor.
Tuve este problema para ejecutar un servidor Bokeh en un hilo. Cuando traté de crear el servidor = Servidor ({'/': aplicación}, puerto = 0), obtendría este error. De la documentación de Tornado encontré lo siguiente...
Class tornado.platform.asyncio.AnyThreadEventLoopPolicy[source]Política de bucle de eventos que permite la creación de bucles en cualquier subproceso. La política de bucle de eventos asyncio predeterminada solo crea automáticamente bucles de eventos en los subprocesos principales. Otros subprocesos deben crear bucles de eventos explícitamente o asyncio.get_event_loop (y, por lo tanto, IOLoop.current) fallará. La instalación de esta política permite que los bucles de eventos se creen automáticamente en cualquier subproceso, coincidiendo con el comportamiento de las versiones de Tornado anteriores a la 5.0 (o 5.0 en Python 2).
Uso:
asyncio.set_event_loop_policy(AnyThreadEventLoopPolicy())http://www.tornadoweb.org/en/stable/asyncio.html#tornado.platform.asyncio.AnyThreadEventLoopPolicy
En Windows con Python 3.7.3, en lugar de crear el bucle de eventos directamente en el hilo,
Tengo que:
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy()) loop = asyncio.new_event_loop() asyncio.set_event_loop(loop)De lo contrario, el problema persistiría.