Q:“或者我应该根据自己的要求切换到 ZeroMQ 吗?”
与前两个相比,最后一个问题对我来说似乎是可以决定的。让我们试试吧:
人们可以选择使用更年轻、轻量级的nanomsg 或成熟的、更多的互操作协议zeromq,尽管只给出了 inproc://-transport-提到了类,后者似乎已经为这项任务做好了准备。
如果只需要这个传输类,可以使用显式请求将数据泵实例化为纯 I/O-thread-less Context()-instances:
#define Zero_IO_threads 0
void *myCtx = zmq_ctx_new ( Zero_IO_threads );
assert ( myCtx && "FAILED: zmq_ctx_new ( ... )" );
zmq_ctx_set ( myCtx, ZMQ_BLOCKY, false );
void *aPubSocket = zmq_socket ( myCtx, ZMQ_PUB );
assert ( aPubSocket && "FAILED: zmq_socket ( ... )" );
...
void *aSubSocket = zmq_socket ( myCtx, ZMQ_SUB );
assert ( aSubSocket && "FAILED: zmq_socket ( ... )" );
rc = zmq_setsockopt ( aSubSocket, ZMQ_SUBSCRIBE, "", 0 );
assert ( rc == 0 && "FAILED: zmq_setsockopt ( aSubSocket, ... )" );
...
rc = zmq_bind ( aPubSocket, "inproc://#A" ); // Def inproc name "#A"
assert ( rc == 0 && "FAILED: zmq_bind ( aPubSocket, ... )" );
...
rc = zmq_connect ( aSubSocket, "inproc://#A"); // Try connect to #A
assert ( rc == 0 && "FAILED: zmq_connect ( aSubSocket, ... )" );
// ___________________________________________aSubSocket can start receive messages
...
// ___________________________________________FINALLY: gracefully close & terminate
assert ( 0 == zmq_close ( aPubSocket ) && "FAILED: zmq_close( aPubSocket )" );
...
assert ( 0 == zmq_close ( aSubSocket ) && "FAILED: zmq_close( aSubSocket )" );
...
assert ( 0 == zmq_ctx_term ( myCtx ) && "FAILED: zmq_ctx_term( myCtx )" );