我有一个接受HTTP请求的Flask应用。当某些HTTP请求进入时,我想在zeromq流上触发消息。我想一直打开zeromq流。我想知道这样做的恰当方法是什么。由于建议在生产中使用带有Flask的gunicorn,这并不意味着Flask应用程序会有多个实例,如果我将zeromq连接放在与Flask应用程序相同的位置,那么只有其中一个将能够连接,其他人将失败。
答案 0 :(得分:3)
我使用threading.local()对象来存储zeromq上下文和套接字对象。
这样我就可以重新使用线程中已连接的套接字,同时确保每个线程都有自己的套接字对象。
答案 1 :(得分:1)
您的应用中的ZMQ套接字是connect()
- 还是bind()
?如果您的应用程序被视为客户端并且它正在连接,那么多个实例应该能够毫无问题地连接。如果它被认为是服务器并且它是绑定的,那么是的,你会遇到问题...但在你的情况下,你似乎应该考虑你的Flask应用程序更短暂,因此客户端,另一端是更可靠,从而服务器。
但是如果没有代码就很难给出任何具体的建议,只有这么多我才能从你给出的小信息中汲取。
答案 2 :(得分:0)
ZeroMQ不应在不同的线程中重用上下文。这同样适用于套接字。
如果您设法将一个线程专用的套接字保留在worker中,则可以重用该套接字 插座。
无论如何,我会开始为每个请求创建新的上下文和套接字,如果有,请查看 任何需要进入共享ZeroMQ连接的复杂性。设置ZeroMQ通常相当快。