C++ cppzmq:是否有可能在不创建全局变量的情况下获取全局上下文?
我的用例通常只涉及一个全局上下文。好的,pyzmq有一个APIC++ cppzmq:是否有可能在不创建全局变量的情况下获取全局上下文?,c++,zeromq,C++,Zeromq,我的用例通常只涉及一个全局上下文。好的,pyzmq有一个APIzmq.Context.instance()来获取全局单例,但是我找不到一个等价的cppzmqAPI 是否可以访问全局上下文而不必显式创建和跟踪它 Q:是否可以访问全局上下文而不必显式地创建它和跟踪它 不,至少在当前的cppzmq 原因: PyZMQ最近开始与普通python语言绑定不同,用于处理已发布的通用ZeroMQ API 不仅仅是绑定 PZZMQ表面上是用于Oy MQ的Python绑定,但该项目在Python的“包含电池”的
zmq.Context.instance()
来获取全局单例,但是我找不到一个等价的cppzmq
API
是否可以访问全局上下文而不必显式创建和跟踪它
Q:是否可以访问全局上下文而不必显式地创建它和跟踪它
不,至少在当前的cppzmq
原因:
PyZMQ最近开始与普通python语言绑定不同,用于处理已发布的通用ZeroMQ API
不仅仅是绑定
PZZMQ表面上是用于Oy MQ的Python绑定,但该项目在Python的“包含电池”的理念下,提供的不仅仅是Python方法和对象,用于调用O.MQC++库。 核心作为绑定
PyZMQ目前分为四个子包。首先是核心zmq.core
包含ZeroMQ的实际绑定,除了非常基本的功能外,没有扩展的功能。核心模块被拆分,这样每个基本的ZeroMQ对象(或函数,如果没有对象关联)都是一个单独的模块,例如zmq.core.context
包含
对象,zmq.core.poll
包含一个Poller
对象以及select()
函数,为了方便起见,ZMQ常量都保存在ZMQ.core.constants
中
将核心分解为子模块有两个原因:重新编译和衍生项目。单片PyZMQ变得非常乏味,因为它需要重新编译所有内容,只需对单个对象进行一个小的更改。对于单独的文件,不再需要这样做。第二个原因与Cython有关。PyZMQ是用Cython编写的,Cython是为Python高效编写C扩展的工具。通过将我们的对象分离到单独的pyx文件中,每个文件的声明都在pxd头中,其他项目可以用Cython编写扩展名,并在C级直接调用ZeroMQ,而不必检查我们的Python对象
线程安全性
在ØMQ中,上下文是线程安全对象,但套接字不是。在整个多线程应用程序中使用单个上下文
(例如,通过zmq.Context.instance()
)是安全的,但您应该基于每个线程创建套接字。如果跨线程共享套接字,则很可能会遇到应用程序的uncatchablec-level崩溃,除非您明智地使用线程。锁定
,但不建议使用此方法。
努力工作的ZeroMQ极客们已经注意到,最初的ZeroMQ API(早在v2.1.11+时代就开始)还有其他建议:
1) 应用程序必须明确创建至少一个上下文
-实例(并在以后终止)
2) 上下文
-实例可以在线程间自由共享,而不需要在上下文
-服务调用方端进行任何锁定
3) 即使将Socket
-实例传递(非迁移)到新创建的线程(即,由不属于“外部”-上下文的线程维护),也会授予线程安全性,PyZMQ文档从中明确警告并分散用户的注意力。看起来您必须创建自己的单例并管理其生存期。单例被视为反模式,这是不使用它们的原因,更不用说将其作为默认设置了。再次。非常好的总结和资源。非常感谢。