我有几个使用我创建的共享ZMQ类的服务器应用程序。有时,当这些服务器处理请求时,他们需要向另一个ZMQ服务器发送消息。我是ZMQ的新手,所以我想确保我理解正确。
处理服务器侦听器的类创建zmq::context_t
和zmq::socket_t
,并绑定套接字。这无限地在一个单独的线程上运行。当这个服务器需要在另一个函数中发送消息(从这个ZMQ类完全撕掉)时,我是否需要在这里生成一个新的上下文并发送消息,或者我应该以某种方式将相同的上下文传递给这个类(on一个不同的线程),绑定一个新的套接字,然后从那里去?
如果是前者,我用来初始化新上下文的数字或 context( 1 )
是否正常?在指南中有一个部分说创建第二个上下文就像有多个ZMQ实例,我认为这并不重要,因为它只用于发送文件然后关闭。但我可能错了?
答案 0 :(得分:3)
简而言之:单个I / O线程的单个 context
实例可能就是您所需要的。更详细:
Per the docs上下文是线程安全的。请注意,原始的0MQ 套接字通常不是(有一些较新的,草拟的,设计成这样的)。
来自FAQ:
为获得最佳性能,最佳I / O线程数是多少?
基本的启发式方法是在上下文中为每个每秒千兆位的数据分配1个I / O线程,这些数据将被发送和接收(聚合)。 此外,I / O线程的数量不应超过(number_of_cpu_cores - 1)。
需要注意的另一件事是 inproc://
传输类套接字must be created in the same context.
除非您传输多个千兆位/秒,否则我建议使用单个I / O线程为您的整个过程提供单个上下文。
同样作为指导原则,0MQ上下文旨在“长寿”。在单个应用程序运行中创建/销毁多个上下文是不常见的。这通常也适用于0MQ套接字。如果您正在创建/销毁许多套接字,则可能采取了错误的方法。