【发布时间】:2016-08-12 21:12:26
【问题描述】:
我运行aiohttp 应用程序,Gunicorn 在nginx 后面。
在我的应用程序的初始化模块中,我不使用web.run_app(app) 运行应用程序,而只是创建一个将由Gunicorn 导入的实例,以便在Gunicorn 创建的每个worker 中运行它。
所以Gunicorn 创建了一些工作进程,在其中创建了事件循环,然后runs 在这些循环中创建了应用程序的请求处理程序。
我的aiohttp 应用程序有一组连接的WebSockets(移动应用程序客户端),我想在Gunicorn 启动的任何应用程序进程中发生事件时通知它们。
我想通知连接到所有应用程序进程的所有 WebSockets。
因此,我使用ZeroMQ 创建了某种上游代理,并且我想在每个应用程序进程中使用zmq.SUB 套接字订阅它。
...所以基本上我想在每个应用程序工作人员中实现这样的目标:
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect('tcp://localhost:5555')
while True:
event = socket.recv()
for ws in app['websockets']:
ws.send_bytes(event)
# break before app shutdown. How?
如何监听aiohttp 应用程序中的ZeroMQ 代理将消息转发到WebSockets?
我可以在哪里放置这段代码在事件循环中的后台运行,以及如何在aiohttp 应用程序的生命周期内正确运行和关闭它?
更新
我已经在 aiohttp 的 GitHub 存储库中创建了一个 issue 来描述问题并提出可能的解决方案。我非常感谢您在这里或那里就所描述的问题提供意见。
【问题讨论】:
-
我正在尝试做同样的事情(结合 ZMQ 和 aiohttp),但您的答案与问题有何关系?这与 zmq 无关,是吗?
-
@Alex 没错。问题是如何从同一个 aiohttp 进程在后台收听 ZeroMQ(或任何其他队列)。那时 aiohttp 没有 on_startup 信号处理程序。但现在有了,所以在后台监听任意数量的队列都没有问题。
标签: python zeromq gunicorn python-asyncio aiohttp