Zmq 上下文 - 我应该在新线程中创建另一个上下文吗?
Zmq Context - Should I create another context in a new thread?
我有几个使用我创建的共享 ZMQ class 的服务器应用程序。偶尔当这些服务器处理请求时,它们需要发送消息到另一个 ZMQ 服务器。我是 ZMQ 的新手,所以我想确保我理解正确。
处理服务器监听器的class创建一个zmq::context_t
和zmq::socket_t
,并绑定套接字。这无限地在一个单独的线程上运行。当这个服务器需要在另一个函数中发送消息时(完全从这个 ZMQ class 中分离出来),我是否需要在这里生成一个新的上下文并发送消息,或者我应该以某种方式将相同的上下文传递给这个class(在不同的线程上),绑定一个新的套接字然后从那里去?
如果是前者,我用什么数字来初始化新上下文有关系吗?还是 context( 1 )
好?指南中有一部分说创建第二个上下文就像拥有多个 ZMQ 实例,我认为这并不重要,因为它仅用于发送文件然后关闭。但我可能错了?
简而言之:context
的单个实例和单个 I/O 线程可能就是您所需要的。更详细:
Per the docs 上下文是线程安全的。请注意,原始的 0MQ 套接字 通常不是(有一些更新的、草拟的、设计成这样的套接字)。
来自FAQ:
What is the optimal number of I/O threads for best performance?
The basic heuristic is to allocate 1 I/O thread in the context for every gigabit per second of data that will be sent and received ( aggregated ).
Further, the number of I/O threads should not exceed ( number_of_cpu_cores - 1 ).
另一个需要注意的是inproc://
transport-class sockets must be created in the same context.
除非您要传输多个 gigabits/sec,否则我建议使用单个 I/O 线程为您的整个进程使用单个上下文。
此外,作为准则,0MQ 上下文旨在 "long-lived"。在单个 运行 应用程序中 create/destroy 多个上下文是不寻常的。这通常也适用于 0MQ 套接字。如果你有 creating/destroying 个套接字,你可能采用了错误的方法。
我有几个使用我创建的共享 ZMQ class 的服务器应用程序。偶尔当这些服务器处理请求时,它们需要发送消息到另一个 ZMQ 服务器。我是 ZMQ 的新手,所以我想确保我理解正确。
处理服务器监听器的class创建一个zmq::context_t
和zmq::socket_t
,并绑定套接字。这无限地在一个单独的线程上运行。当这个服务器需要在另一个函数中发送消息时(完全从这个 ZMQ class 中分离出来),我是否需要在这里生成一个新的上下文并发送消息,或者我应该以某种方式将相同的上下文传递给这个class(在不同的线程上),绑定一个新的套接字然后从那里去?
如果是前者,我用什么数字来初始化新上下文有关系吗?还是 context( 1 )
好?指南中有一部分说创建第二个上下文就像拥有多个 ZMQ 实例,我认为这并不重要,因为它仅用于发送文件然后关闭。但我可能错了?
简而言之:context
的单个实例和单个 I/O 线程可能就是您所需要的。更详细:
Per the docs 上下文是线程安全的。请注意,原始的 0MQ 套接字 通常不是(有一些更新的、草拟的、设计成这样的套接字)。
来自FAQ:
What is the optimal number of I/O threads for best performance?
The basic heuristic is to allocate 1 I/O thread in the context for every gigabit per second of data that will be sent and received ( aggregated ). Further, the number of I/O threads should not exceed ( number_of_cpu_cores - 1 ).
另一个需要注意的是inproc://
transport-class sockets must be created in the same context.
除非您要传输多个 gigabits/sec,否则我建议使用单个 I/O 线程为您的整个进程使用单个上下文。
此外,作为准则,0MQ 上下文旨在 "long-lived"。在单个 运行 应用程序中 create/destroy 多个上下文是不寻常的。这通常也适用于 0MQ 套接字。如果你有 creating/destroying 个套接字,你可能采用了错误的方法。