本文介绍了如何在线程中运行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服务器?
发布评论