我应该为zeroMQ程序初始化添加睡眠以避免heisenbugs吗?

时间:2012-02-07 17:16:35

标签: zeromq

我正在开发一个zeroMQ概念验证,它涉及一个主进程,它发布控制命令,并从任意数量的工作进程中推送和提取数据。

在初始化时,如果我使用shell脚本启动它们,那么主机和工作程序(单独的进程)有时会失去同步。但是,如果我以任何顺序手动启动它们(在单独的控制台窗口中),我从未见过这个。我开始考虑在每个进程绑定/连接到套接字之后添加一个sleep()来避免这个明显的heisenbug - 但我也想知道我是不是只是愚蠢。有什么建议吗?

以下是偶尔出现故障的shell脚本。主人使用PUB和PUSH与工人交谈,并使用PULL套接字获取信息。我认为heisenbug是由于其中一名工人没有看到主人的PUB消息而引起的。

echo "starting worker A in background"
python pWorkerA.py > /tmp/A.out &
echo "starting worker B in background"
python pWorkerB.py > /tmp/B.out &
echo "starting master"
python abMaster.py

如果我使用sleep()

,我觉得我在作弊

1 个答案:

答案 0 :(得分:1)

您必须假设在PUB上发送的消息在建立连接之前不会到达SUB套接字。建立连接需要一些有限的,如果非常小的时间,那么在那个小窗口中发送的任何消息都不会到达尚未连接的SUB。正如您所建议的那样,避免这种情况的一种简单方法是在绑定后向主服务器添加睡眠。这不是完全可靠的,因为工人在技术上可能连接速度超慢,或者在主人之后启动,并且当他们成功时没有实际信号。

一种更可靠的方法,如果你确实需要确认工人已经连接,那就是拥有一个握手机制,这样工人就可以向主人发送一个小的“嗨,我已经准备好”的消息(在另一个频道上)连接后。然后,主服务器仅在收到必要数量的握手后才开始发布消息(取决于应用程序的适当逻辑)。