gpt4 book ai didi

java - 如何中断 JeroMQ 套接字上对 .read() 方法的调用?

转载 作者:行者123 更新时间:2023-11-30 06:15:16 25 4
gpt4 key购买 nike

在我的代码中,我有一个线程等待 ZeroMQ 端点上的事件,其主循环看起来与此类似:

while (externalCondition) {
byte[] bytes = subscriber.recv(0);
// Do things
}

问题是,如果我想退出线程(例如因为我想要关闭应用程序)。

我尝试中断线程,但这似乎不起作用。

最佳答案

欢迎来到 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上面使用的可扩展正式通信模式的一面有一个阴暗面。除非一个人明确“订阅”某些报纸和/或杂志,否则任何内容都不会进入一个人的 SUB 中。 -端邮箱,根本没有任何内容被交付,因为“交付服务”没有收到您的任何订阅,告诉他们您想要(接收)和阅读什么

所以,永远不要忘记提交对这样的调用

subscriber.setsockopt( aSubject_What_To_Subscribe_To_Indeed_Receive_STRING );

不这样做,就永远不会.recv()一个字节。

<小时/>

Thanks. What would be the "brutal" one?Alessandro Polverini 23 hours ago

嗯,自 2018 年第一季度起,ZeroMQ 原生 API 允许采用一种相当残酷的方式来强制中断对 .recv() 的阻塞调用。 方法 - 调用 <Context>.term() - 所以,当只要求几张纸时,它的工作方式更像是“拆除人”......确实如此,而且还有更多的先决条件如果不是无限地(如果没有立即保护从 native API 生成的所有 Socket 实例),不要将您的进一步代码执行挂起在不受控制的类似僵尸的状态中。配置了 .setsockopt( zmq.LINGER, 1 ) (自 native API 2.1+ ~ 4.(?) 发布了 promise 的默认值更改...各自的语言绑定(bind)/包装器在版本采用方面有所不同,因此不能一般引用最好在实例化发生后立即检查 使用已发布的 .getLinger() 公开的方法来查看每个事件的 react 性:o) )。

使用 .term()号召类似大规模杀伤性武器的歼灭-方法,将在这些情况下,其中 Socket - zmq.LINGER 没有让实例等待(不确定地,如果不是无限地) -实例属性,取消内部-FSA并退出,即使仍然阻塞-{ .recv() | .send() | poll() } -s 并将代码执行控制路径返回到您的“Demolition Man”控件:o)

可行,但有点苛刻,不是吗?

关于java - 如何中断 JeroMQ 套接字上对 .read() 方法的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49350765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com