gpt4 book ai didi

c - 发布-订阅方案中的异常处理 (ZeroMQ)

转载 作者:行者123 更新时间:2023-11-30 18:27:17 27 4
gpt4 key购买 nike

我使用 ZeroMQ 创建了一个发布者-订阅者通信方案,我注意到我的服务器和客户端程序存在一个小问题。我知道 C 中没有 try catch(根据我的简短研究),但是接下来的两个 while(1) 没有异常捕获对我来说似乎很危险。

考虑到以下代码片段,处理异常(在 while 内)的最正确方法是什么?根据我现在的结构(如下所示),zmq_closezmq_ctx_destroy 将永远不会执行,但我希望它们能够执行,以防出现程序错误/异常(以来源为准)。

注意:在此架构中,我有一个客户端监听多个发布者,因此 客户端 代码中存在 for 循环。

服务器

(...inside main)

while (1) {
char update[20];
sprintf(update, "%s", "new_update");
s_send(publisher, update);
sleep(1);
}

zmq_close(publisher);
zmq_ctx_destroy(context);
return 0;

客户端

(...inside main)

while(1){
for (c = 1; c < server_num; c = c + 1){
char *msg = s_recv(subscribers[c]);

if (msg) {
printf("%s\n",msg);
free(msg);
}
sleep(1);
}
}

for (c = 0; c < server_num; c = c + 1)
zmq_close(subscribers[c]);

zmq_ctx_destroy(context);
return 0;

最佳答案

如果从未使用过 ZeroMQ,
或者从未接触过零禅艺术的概念,
大家可以先看看"ZeroMQ Principles in less than Five Seconds"在深入了解更多细节之前

成为标签 现在...:

Q : what would be the most correct way to handle an exception (inside the while)?

最好的策略错误预防,而不是任何< em> 种 的“响应式(Reactive)”(事后异常)处理。

永远假设事情可能并且将会造成严重破坏,并让它们以低廉的代价失败。失败的成本越低,系统就可以更好、更快地恢复到它自己的预期行为。

这就是现代的 ,更多在 异常是设计代码执行流程中极其昂贵且具有破坏性的元素。

<小时/>

出于这些原因,也为了实现持续的最高性能水平,

ZeroMQ 自此采用了一种非常不同的方法:

0)
更好地使用 zmq_poll() 作为有史以来最便宜的检测任何可读消息的存在(或不存在)(已经发送并准备好接收),之前,如果有的话,调用zmq_recv()的API函数,从 Context() 内部将此类数据获取到应用程序级代码的手中。 -实例内部存储。

1)
根据您的语言绑定(bind)(包装器),最好享受 .poll()非阻塞形式 , .send().recv()方法。原生 API 是最直接的,总是使用 retCode = zmq_recv( ..., ZMQ_NOBLOCK ); 进入此模式。

2)
始终分析 retCode - 无论是沉默还是解释 assert( retCode == 0 && zmq_errno() )或其他方式。

3)
对 ZeroMQ 框架中可用的实例化工具进行最佳审查和微调所有配置属性,并利用其所有隐藏优势来最好地满足您的应用程序域的需求。许多 native API 设置可能有助于减轻(如果不是主要避免的话)Context() 内的大量冲突要求。 -engine 实例,因此请毫不犹豫地了解可能设置的所有详细信息,并最大限度地利用它们来为您的代码提供帮助。

如果不执行上述所有操作,您的代码就无法充分利用Zen-of-Zero

<小时/>

Q : With the structure I have right now (...), the zmq_close and zmq_ctx_destroy will never execute, but I want them to, in case of a program error/exception (whichever the origin).

设置一个显式标志就足够公平了:

bool    DoNotExitSoFar = True;

while ( DoNotExitSoFar ){
// Do whatever you need

// Record return-codes, always
retCode = zmq_...(...);

// Test/Set the explicit flag upon a context of retCode and zmq_errno()
if ( retCode == EPROTONOTSUPPORTED ){
// take all due measures needed
...
// FINALLY: Set
DoNotExitSoFar = False;
}
}

// --------------------------------------------- GRACEFUL TERMINATION .close()
if ( ENOTSOCK == zmq_close(...) ) { ...; }
...
// --------------------------------------------- GRACEFUL TERMINATION .term()
retCode = zmq_ctx_term(...);

if ( EINTR == retCode ){ ...; }
if ( EFAULT == retCode ){ ...; }
...
<小时/>

使用其他工具,例如 int atexit(void (*func)(void));可以作为 ALAP 调用 zmq_close() 的最后手段或zmq_ctx_term()

关于c - 发布-订阅方案中的异常处理 (ZeroMQ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58066493/

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