在关闭0MQ插座之前休眠

时间:2013-01-18 08:28:27

标签: c messaging zeromq

在Code Connected书籍第1卷(第23页)中,有一个使用PUSHPULL消息传递的示例。在关闭套接字之前,它使用sleep()。这是代码:

printf("Total expected cost: %d msec\n", total_msec);
sleep(1); // Give 0MQ time to deliver

zmq_close(sink);
zmq_close(sender);
zmq_ctx_destroy(context);

sleep(1)是什么意思?这是一般规则吗?

2 个答案:

答案 0 :(得分:3)

taskvent.c和tasksink2.c中的sleep(1)是示例仍然使用0MQ / 2.2时的宿醉,如果你在0MQ / 3.2上运行,你可以删除这两行代码。我刚刚完成了这项工作,经过测试,并且它可以按照您的预期运行。

原因:在2.2中,当您终止上下文时,套接字被销毁并且消息被丢弃。在3.2中,消息将在LINGER套接字选项指定的超时内传递,默认情况下为无限。

有许多其他使用“睡眠”的例子,原因很充分:

  • 模拟工作量
  • 让演示启动时连接一组对等并连接
  • 在演示关闭时让一组对等体
  • 错误后重试

您可以以不同的方式进行启动和关闭同步,但在简单示例中它会比我们想要的更复杂。

答案 1 :(得分:-1)

使用sleep(X)是一种坏习惯,通常表示设计不好。 ZeroMQ并不以其实施质量而闻名。

这里的目的是等待ZeroMQ发送ZeroMQ套接字的发送队列中存在的所有待处理消息。

假设1秒足够长但绝对没有保证。因此,该程序将在大多数时间工作,但不是所有时间。

更好的方法是定期检索发送队列中待处理消息的数量,并等待此数字降至零。可以添加总超时以避免无限等待。

我不知道ZeroMQ是否提供了这样的API。