2

In Code Connected book volume 1(page 23) there is a example for using PUSH, PULL messaging. Before closing sockets it uses sleep(). Here is the code:

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);

What is that sleep(1) about? Is this general rule?

4

2 回答 2

3

taskvent.c 和 tasksink2.c 中的 sleep (1) 是示例仍然使用 0MQ/2.2 时的遗留问题,如果您在 0MQ/3.2 上运行,则可以删除这两行代码。我刚刚做到了,经过测试,它可以按您的预期工作。

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

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

  • 模拟工作负载
  • 让演示中的一组对等点启动并连接
  • 让演示中的一组对等方关闭
  • 出错后重试

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

于 2013-01-18T11:16:21.573 回答
-1

使用 sleep(X) 是一个坏习惯,通常表示一个糟糕的设计。ZeroMQ 的实施质量并不出名。

这里的目的是等到 ZeroMQ 发送完 ZeroMQ 套接字的发送队列中存在的所有未决消息。

1秒被认为足够长,但绝对没有保证。因此,该程序将在大部分时间而不是所有时间运行。

更好的方法是定期检索发送队列中未决消息的数量,并等待该数量降至零。可以添加整体超时以避免无限等待。

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

于 2013-01-18T10:36:16.540 回答