【问题标题】:sleep before closing 0MQ sockets在关闭 0MQ 套接字之前休眠
【发布时间】:2013-01-18 08:28:26
【问题描述】:

在 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) 是关于什么的?这是一般规则吗?

【问题讨论】:

  • 听起来很像一个简单的技巧,可以在关机前获取所有消息以用于演示目的。 1 秒的固定 sleep 对于生产代码来说似乎非常危险。

标签: c messaging zeromq


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    假设 1 秒足够长,但绝对没有保证。因此,该程序将在大部分时间运行,但并非一直运行。

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

    不知道ZeroMQ有没有提供这样的API。

    【讨论】:

    • 在示例中,为了正确传递 KILL 消息,调用者必须设置套接字延迟。那不是我当时想在课文中解释的事情。文本对此非常清楚,例如,“有一种简单而愚蠢的方法来延迟发布者,那就是休眠。但是,不要在实际应用程序中这样做,因为它非常脆弱并且不优雅并且慢。使用 sleep 向自己证明发生了什么,然后等待 [后面的解释] 看看如何正确执行此操作。"
    • 在一个例子中你最好给出正确的例子。大多数人会复制它而不会问任何像这里这样的问题。
    猜你喜欢
    • 2013-09-05
    • 2014-10-03
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    相关资源
    最近更新 更多