¿Cómo ejecutar un servidor aiohttp en un hilo?

Este ejemplo de servidor aiohttp en un subproceso falla con un RuntimeError: There is no current event loop in thread 'Thread-1'. error:

 import threading from aiohttp import web def aiohttp_server(): def say_hello(request): return web.Response(text='Hello, world') app = web.Application(debug=True) app.add_routes([web.get('/', say_hello)]) web.run_app(app) t = threading.Thread(target=aiohttp_server) t.start() 

¿Cómo ejecutar un servidor aiohttp en hilo?

Cree un handler en el hilo principal y cree manualmente un bucle de evento en el hilo secundario.

 import asyncio import threading from aiohttp import web def aiohttp_server(): def say_hello(request): return web.Response(text='Hello, world') app = web.Application(debug=True) app.add_routes([web.get('/', say_hello)]) handler = app.make_handler() return handler def run_server(handler): loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) server = loop.create_server(handler, host='127.0.0.1', port=8089) loop.run_until_complete(server) loop.run_forever() t = threading.Thread(target=run_server, args=(aiohttp_server(),)) t.start() 

Debemos usar el controlador app.make_handler en el hilo principal, ejemplo:

 import asyncio import threading from aiohttp import web loop = asyncio.get_event_loop() def say_hello(request): return web.Response(text='Hello, world') app = web.Application(debug=True) app.add_routes([web.get('/', say_hello)]) handler = app.make_handler() server = loop.create_server(handler, host='127.0.0.1', port=8080) def aiohttp_server(): loop.run_until_complete(server) loop.run_forever() t = threading.Thread(target=aiohttp_server) t.start()