在生产环境中如何正确使用Flask与zeromq?
我有一个Flask应用,它可以接受HTTP请求。当某些HTTP请求到达时,我想在一个zeromq流上触发一个消息。我希望这个zeromq流一直保持打开状态。我在想,应该怎么做比较合适。因为在生产环境中推荐使用gunicorn来搭配Flask,这是不是意味着会有多个Flask应用的实例?如果我把zeromq的连接放在Flask应用的同一个地方,那么只有一个实例能连接,其他的就会失败。
3 个回答
0
ZeroMQ 不应该在不同的线程之间共享上下文。对套接字也是一样的。
如果你能确保某个套接字只被一个线程使用,那么你可以重复使用这个套接字。
不过,我建议你每次请求时都创建一个新的上下文和套接字,看看是否有必要去处理共享 ZeroMQ 连接的复杂问题。设置 ZeroMQ 通常是非常快的。
2
你的应用里的ZMQ套接字是在用connect()
连接,还是在用bind()
绑定呢?如果你的应用被当作客户端在连接,那多个实例应该可以顺利连接。如果被当作服务器在绑定,那就会有问题……不过在你的情况下,似乎应该把你的Flask应用看作是一个临时的客户端,而另一端则是更可靠的服务器。
不过没有代码的话,很难给出具体的建议,我只能根据你提供的信息来推测一些东西。
4
我使用一个 threading.local() 对象来存储 zeromq 的上下文和套接字对象。
这样一来,我就可以在一个线程里重复使用已经连接好的套接字,同时确保每个线程都有自己独立的套接字对象。