我目前正在从事一个需要通过网络进行一些通信的项目,并且我正在使用ZMQ。该项目的主要目标是拥有一个中央节点,为可以随时连接的客户端提供服务。对于连接的每个客户端,中央节点应产生一个相应的工作线程并代理两者之间的通信。所有通信都通过tcp进行。
客户和工作人员需要随时发送和接收消息,因此它们是ZMQ_DEALER
类型的套接字,而中央节点是ZMQ_ROUTER
。
我有一个问题,即一段时间后,中央节点中的所有线程(路由器和所有工作程序)将死锁。在检查所有ZMQ线程的堆栈后,它们在win上的SockWaitForSingleObject
和linux上的poll
/epoll_wait
上均被阻塞。
我做了一个最小的例子,重现了http://pastebin.com/aUTg7RJY问题(它在pastebin中,因为它相当长)
在该示例中,客户端与 worker 处于相同的过程中,并且所有客户端都已预先连接,但在实际情况下不是这样,但这没有任何区别-在两种情况下,问题都是相同的。
我试图修改示例代码以使用inproc
协议(protocol)进行工作节点通信,但问题仍然存在http://pastebin.com/MJBHNyiF
我不知道我的问题是网络架构还是滥用ZMQ lib。我将不胜感激!
最佳答案
这是一个非常复杂的示例,但有几个问题需要提及:
(
while (1) { this_thread::sleep_for(milliseconds(1));}
)DealerSocket
RouterSocket
通信时,应模拟RequestSocket
ResponseSocket
。在客户和工作人员中,您忘记在内容之前添加一个空框架,这意味着您不遵守zmq协议(protocol)。 这些问题实际上都不是您的问题,但是不遵守zmq规则可能会产生奇怪的影响。