如何在线程中运行aiohttp服务器?
问题描述:
此aiohttp服务器在线程中的示例失败,并出现 RuntimeError:线程'Thread-1'中没有当前事件循环。
错误:
This example of aiohttp server in a thread fails with an 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()
如何在线程中运行aiohttp服务器?
How to run a aiohttp server in thread?
答
在主线程中创建处理程序
,并在子线程中手动创建事件循环。
Create handler
in main thread and manually create an event loop in child thread.
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()
更新
对于新的 aiohttp
,请使用以下内容,谢谢@Auyer的通知。
Update
For new aiohttp
, use the following, thank @Auyer for notification.
import asyncio
import threading
from aiohttp import web
def aiohttp_server():
def say_hello(request):
return web.Response(text='Hello, world')
app = web.Application()
app.add_routes([web.get('/', say_hello)])
runner = web.AppRunner(app)
return runner
def run_server(runner):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(runner.setup())
site = web.TCPSite(runner, 'localhost', 8080)
loop.run_until_complete(site.start())
loop.run_forever()
t = threading.Thread(target=run_server, args=(aiohttp_server(),))
t.start()