本文介绍了如何在线程中运行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()
这篇关于如何在线程中运行aiohttp服务器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!