gpt4 book ai didi

zeromq - 我应该在 zeroMQ 程序初始化中添加 sleep 以避免 heisenbugs 吗?

转载 作者:行者123 更新时间:2023-12-01 05:35:07 25 4
gpt4 key购买 nike

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

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

下面是偶尔失败的 shell 脚本的样子。 master 使用 PUB 和 PUSH 与 worker 对话,并使用 PULL 套接字获取信息。我认为 heisenbug 是由于某个 worker 有时看不到来自主人的 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(),我觉得我在作弊

最佳答案

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

如果您确实需要确认工作人员已连接,则更可靠的方法是具有握手机制,以便工作人员在连接后向主服务器发送一个小的“嗨,我准备好了”消息(在不同的 channel 上)。然后,master 仅在收到必要数量的握手后才开始发布消息(取决于您的应用程序的适当逻辑)。

关于zeromq - 我应该在 zeroMQ 程序初始化中添加 sleep 以避免 heisenbugs 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9180709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com