【发布时间】:2020-04-02 13:14:00
【问题描述】:
我们有一个处理消息传递/队列、数据库查询和计算机视觉的丰富后端应用程序。我们需要的另一个特性是 tcp 通信——最好是通过 http。关键是:这主要不是一个网络应用程序。我们希望为不同的目的设置一组 http 通道。是的 - 我们了解包括主题和发布-订阅在内的消息传递:但基于直接 tcp 的请求/响应也有它的位置。
我已经查看并试用了六个 python http web 服务器。它们隐含或显式描述了在 main 线程上运行 event loop 的要求。这对我们来说是本末倒置:main 线程已经被其他任务占用,包括其他活动的协调。
为了说明预期的结构,我将从我的aiohttp 特定问题How to run an aiohttp web application in a secondary thread 中提取代码。在那个问题中,我尝试在另一个独立脚本中运行,但在从属线程上运行:
def runWebapp():
from aiohttp import web
async def handle(request):
name = request.match_info.get('name', "Anonymous")
text = "Hello, " + name
return web.Response(text=text)
app = web.Application()
app.add_routes([web.get('/', handle),
web.get('/{name}', handle)])
web.run_app(app)
if __name__ == '__main__':
from threading import Thread
t = Thread(target=runWebapp)
t.start()
print('thread started let''s nap..')
import time
time.sleep(50)
这给出了错误:
RuntimeError: There is no current event loop in thread 'Thread-1'.
这个错误的意思是“嘿,你没有在 main 线程上运行这个”。
我们可以在这里逻辑地将aiohttp 替换为其他网络服务器。这种要求 Web 服务器的事件处理循环在辅助线程上运行的方法是否适用?到目前为止,我还尝试过cherrypy、tornado 和flask。
请注意,我没有尝试过的一个著名的网络服务器是django。但这似乎需要围绕django 的预期目录结构(/必需?)对应用程序进行广泛的重组。我们不希望这样做,因为该应用程序有一系列其他用途,可以取代拥有 http 服务器的这种杂耍。
我看过的一种方法是asyncio。我不明白它是否可以支持在侧线程上运行事件循环:如果可以,那么它将是这个问题的答案。
在任何情况下,是否有任何 Web 服务器明确支持让其事件循环脱离主线程?
【问题讨论】:
标签: python multithreading embeddedwebserver