使用ZeroMQ套接字时,我可以从一个线程发送(),从另一个线程发送recv()到同一个套接字吗?

时间:2014-09-24 14:49:49

标签: multithreading sockets zeromq send recv

我找到了question!之前,但我仍然不知道该怎么做,如果我需要使用ROUTER到DEALER套接字构建异步客户端/服务器

在使用zeromq之前,当我需要构建异步服务器时,我将分离套接字的读取部分和写入部分。

[dispatch]工作人员epoll_wait套接字读取事件并启动[worker]线程根据msg做一些工作,

最后,在同一套接字的某个不同线程中将触发.send()操作。

读取和发送可以在两个不同的线程中分开。

在2个不同的线程中为一个套接字发送和发送

使用zeromq socket是否可以(允许)?

实际上我搜索一些邮件列表并得到否定答案。

然后我想知道如何处理这种情况?

如果只有一个线程可用于套接字,如何提高整个服务器的并行度和吞吐量?

3 个答案:

答案 0 :(得分:1)

ZeroMQ传福音宣传"零分享==不分享任何东西*"

应该读它不共享套接字(更确切地说是a-ZMQ-socket 接入点 - 对象),所以正确,你不应该将你的代码设计为" share"多个线程中的任何套接字。

这并不意味着两个不同的线程或分布式进程无法通过单个ZMQ套接字相互监听/说话,这是在它们之间设置的(一个.bind() - s,另一个{s} {{ 1}})。

所以 .connect() - < __ behavioralArchetypePRIMITIVE _ >可以[ROUTER]将其输出到同一个ZMQ套接字对象中,该对象是 .bind() 在另一端发布的.connect() - < __ behavioralArchetypePRIMITIVE _ > (如图27 Extended REQ / ROUTER | DEALER / REP Pattern)并完成工作。

*) Nota bene:

零共享 规则存在一个主要例外情况,其中ZMQ [DEALER]实例可能会在某些localhost线程之间有意共享。

答案 1 :(得分:0)

您试图通过将套接字的发送和接收操作分成两个不同的线程来解决问题?它阻塞了吗?因为您的单线程在等待响应时不需要阻塞,所以您只需使用轮询继续处理。

您是否希望根据响应在某个单独的线程中完成某些工作?如果是这样,打开从一个线程到另一个线程的IPC套接字并以这种方式发送工作。

“ZMQ套接字”不是你习惯使用的普通套接字,它们更像是“套接字状的东西”,可以给你一定的超能力,但是你必须用掉低级的螺母和螺栓来换取它们。赞成这种抽象。所以,不,你不能在多个线程之间拆分单个套接字,你必须找到一些其他的方法(使用ZMQ,这对于这类事情是好的,或者不是)在你的线程之间进行通信。

有很多可行的方法可以做到这一点,你选择的方法将取决于你的用例细节。

答案 2 :(得分:0)

在线程之间共享套接字肯定会失败,因为zmq指南clearly states

我最近为应用程序实现了类似的功能。线程接收消息并通过INPROC套接字将它们传递给处理它们的线程。原因是我仍然可以接收消息,而另一个线程仍在处理某些事情(我使用工业系统的API)。我将自己定位于multi-threaded server example。我强烈建议看一下。我的方法是另一种方式(我的#34; main"方法是工作程序,而另一个线程接收消息),但这并不重要。