我找到了question !之前,但如果我需要通过使用 ROUTER 到 DEALER 套接字来构建异步客户端/服务器,我仍然不知道该怎么做。
在使用zeromq
之前,当我需要构建异步服务器时,我会将套接字的读取部分和写入部分分开。
[dispatch]
worker 将epoll_wait
套接字的读取事件并启动[worker]
线程根据消息做一些工作,
最后,将在同一套接字的某个不同线程中触发 .send()
操作。
读取和发送可以分开在两个不同的线程中。
2 个不同线程中的一个套接字的接收和发送
使用 Zeromq 套接字是否可能(允许)?
实际上我搜索了一些邮件列表并得到了否定的答案。
那么我想知道如何处理这种情况?
如果一个socket只能使用一个线程,如何提高整个服务器的并行度和吞吐量?
最佳答案
ZeroMQ 布道提倡“零共享==不要共享任何东西*”
人们应该读到它不共享socket(更准确地说是a-ZMQ-socket access-point-object),所以正确,您不得将代码设计为在多个线程之间“共享”任何套接字。
这并不意味着两个不同的线程或分布式进程不能通过单个 ZMQ 套接字相互监听/对话,这是在它们之间设置的(一个 .bind()
-s,其他.connect()
)。
所以你的[ROUTER]
-<__behavioralArchetypePRIMITIVE_>可以.bind()
将其输出到同一个ZMQ-socket 对象,发布该对象以通过 [DEALER]
在另一端获取 .connect()
-ed-<__behavioralArchetypePRIMITIVE_>(如图 27 Extended REQ / ROUTER | DEALER / REP Pattern 所示)并完成工作。
*) 注意:
此零共享规则有一个主要异常(exception),其中 ZMQ Context
实例可能会在某些本地主机线程之间有意共享。
关于multithreading - 使用 ZeroMQ 套接字时,我可以从一个线程发送()并从另一个线程接收()到同一个套接字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26019970/