在我的代码中,我有一个线程等待 ZeroMQ 端点上的事件,它的主循环看起来类似于:
while (externalCondition) {
byte[] bytes = subscriber.recv(0);
// Do things
}
.recv()
问题是如果我想退出线程(例如因为我想关闭应用程序),我不知道如何中断对方法的调用。
我试图中断线程,但这似乎不起作用。
欢迎使用 ZeroMQ 和分布式系统架构。
有一种简单的方法可以重构这个想法,以便它可以在分布式系统领域工作:
/* THIS CODE IS NOT A COPY+PASTE SYNDROME-PROOF, BUT HAS THE DESIGN IDEA CLEAR,
CODE IS NOT A READY TO RUN, AS THE TARGET LANGUAGE
AND THE ACTUAL ZeroMQ BINDING / VERSION
WILL DECIDE ON FURTHER DETAILS TO CODE IN
*/
while ( True ) { // -[NEVER-BLOCK]----------- aSoftRealTIME-control-loop-<body>--
bool ec = externalCondition;
int rc = subscriber.poll( someSoftRealTimeDELAY_in_ms );
if ( ec
& rc == 0
){
//--------------------------------------------------
// DO NOTHING, AS THERE IS NOTHING TO WORK ON
// or sleep, or
// DO ANY SoftRealTime-controlled / yet interruptible
// maintenance workpackage(s)
//-------------------------------------------------------
}
if ( !ec ){
break; // __________________________ J.I.T. / JMP / RET __^
}
if ( rc < 0 ){
// ZeroMQ .poll() Error Analysis & Error Recovery
}
if ( rc > 0 ){
// ZeroMQ has a thing to indeed .recv(), so read it:
byte[] bytes = subscriber.recv( zmq.DONTWAIT );
... // DO things ... on bytes ...
}
} // ---------------[NEVER-BLOCK]----------- aSoftRealTIME-control-loop-<body>--
虽然这句话对你来说可能是一个相当熟悉的话题,但如果你已经熟悉了 ZeroMQ 内部结构和各种默认值,那么在这里我也要提一下,因为并非所有善良的读者都可能有如此深入的 ZeroMQ 实践。
上面使用的可扩展正式通信模式的SUB
-side(s) 有一个阴暗面。除非有人明确“订阅”了某些报纸和/或杂志,否则不会有任何东西到达自己的SUB
邮箱,根本没有任何东西送达,因为“送货服务”没有收到你的任何订阅,告诉他们您想(接收)并阅读的内容
所以,永远不要忘记向这样一个
subscriber.setsockopt( aSubject_What_To_Subscribe_To_Indeed_Receive_STRING );
没有这样做,就永远不会.recv()
有一个字节。
谢谢。什么是“残酷”的?–<a href="https://stackoverflow.com/users/1475212/alessandro-polverini">Alessandro Polverini 23 小时前
好吧,截至 2018 年第一季度,ZeroMQ 原生 API 允许一种相当粗暴的方式来实现对方法的阻塞调用的强制中断——.recv()
调用几张纸......确实是这样,而且还有进一步的先决条件不要将您的进一步代码执行挂在不受控制的类似僵尸的状态下,如果不是无限的(如果没有保护所有从本机 API 生成的 -instances立即配置(因为本机 API 2.1+ ~ 4.(?) 已发布承诺更改默认值...各自的语言绑定/包装器在版本采用方面有所不同,因此一般不能参考,最好检查jeromq<Context>.term()
Socket
.setsockopt( zmq.LINGER, 1 )
.getLinger()
使用发布的公开方法进行实例化以查看此响应式每个事件:o) )。
使用 -method 调用类似 WMD 的歼灭,.term()
在那些Socket
-instances 没有通过zmq.LINGER
-instance 属性等待(不确定,如果不是无限地)等待的情况下,取消 internal-FSA 并退出即使仍然被阻塞的{ .recv() | .send() | poll() }
-s 并返回您的“ Demolition Man ”的代码执行控制路径-控制:o)
可行,但有点苛刻,不是吗?