在生产环境中如何正确使用Flask与zeromq?

6 投票
3 回答
4010 浏览
提问于 2025-04-18 13:54

我有一个Flask应用,它可以接受HTTP请求。当某些HTTP请求到达时,我想在一个zeromq流上触发一个消息。我希望这个zeromq流一直保持打开状态。我在想,应该怎么做比较合适。因为在生产环境中推荐使用gunicorn来搭配Flask,这是不是意味着会有多个Flask应用的实例?如果我把zeromq的连接放在Flask应用的同一个地方,那么只有一个实例能连接,其他的就会失败。

3 个回答

0

ZeroMQ 不应该在不同的线程之间共享上下文。对套接字也是一样的。

如果你能确保某个套接字只被一个线程使用,那么你可以重复使用这个套接字。

不过,我建议你每次请求时都创建一个新的上下文和套接字,看看是否有必要去处理共享 ZeroMQ 连接的复杂问题。设置 ZeroMQ 通常是非常快的。

2

你的应用里的ZMQ套接字是在用connect()连接,还是在用bind()绑定呢?如果你的应用被当作客户端在连接,那多个实例应该可以顺利连接。如果被当作服务器在绑定,那就会有问题……不过在你的情况下,似乎应该把你的Flask应用看作是一个临时的客户端,而另一端则是更可靠的服务器。

不过没有代码的话,很难给出具体的建议,我只能根据你提供的信息来推测一些东西。

4

我使用一个 threading.local() 对象来存储 zeromq 的上下文和套接字对象。

这样一来,我就可以在一个线程里重复使用已经连接好的套接字,同时确保每个线程都有自己独立的套接字对象。

撰写回答