在Code Connected书籍第1卷(第23页)中,有一个使用PUSH
,PULL
消息传递的示例。在关闭套接字之前,它使用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)
是什么意思?这是一般规则吗?
答案 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。