如何让网络中的N台计算机同时启动活动?

时间:2014-03-17 23:48:52

标签: python networking distributed distributed-computing

我正在尝试创建一个分布式应用程序,该应用程序要求网络中的所有计算机同时执行事件。

假设我们有两个长度相等的数组。

labels[] = ["label1", "label2", "label3", ...]
duration[] = [0.5, 1.2, 0.1, 0.1, 3.0, ...]

我有一个主人,在局域网中有N个奴隶。假设阵列已被复制到所有从站。我现在想要的是在所有这些代码上运行以下代码。

for i in len(labels):
  print labels[i]
  sleep(duration[i])

我需要这些代码在客户端完全同时启动。

如何同时在所有客户端中触发'执行'事件?假设所有客户端都使用相同的NTP服务器同步,如果我要求他们在预定义的时间启动,那么准确度是否合理? duration[]数组的时间元素可以小到0.1秒,我希望有一个合理的同时性。

4 个答案:

答案 0 :(得分:2)

根据http://en.wikipedia.org/wiki/Network_Time_Protocol,“NTP通常可以在公共互联网上保持几十毫秒的时间,并且在理想条件下可以在局域网内实现优于1毫秒的精度。不对称路由和网络拥塞可能导致错误100毫秒或更长。“

因此,使用公共NTP服务器同步到100毫秒内是可行的,这可能是让这个工作起作用的最简单方法。

由于您在局域网上,您可以通过让主服务器向下属发送网络消息来了解当前时间,或者更简单地通过在LAN上运行您自己的NTP服务器来实现更好的性能并将您的群集指向它。

答案 1 :(得分:1)

正如其他人所写的那样,使用Internet NTP服务器可能会造成太大的延迟。

我看到两个选项:

  1. 设置本地NTP服务器并将其用作所有客户端的参考。
  2. 让您的客户端侦听UDP数据包并将其作为广播/多播进行解雇。然后他们应该或多或少地同时开始。

答案 2 :(得分:0)

假设您在LAN上具有不错的性能特征,NTP的替代解决方案就是让主设备向接收方发送消息,以便在收到消息时执行所述任务。如果传输和处理的延迟在预期的“合理同时”范围内,它应该符合要求。根据架构(中断与轮询),系统负载和链路质量(无线),这可以合理地预期为<10毫秒。

此外,802.1q VLAN标准定义了第2层QoS(CoS标记),您可以利用它来确定交换机上此控制流量的优先级。

也许这种方法可以简化应用程序,方法是让一个更简单的“哑”从站 - 监听并响应命令 - 然后是一个拥有所有系统逻辑的主机。

答案 3 :(得分:0)

简短回答 - 恰好在同一时间 - 是不可能的。正如拉塞尔所写,NTP仅在100毫秒内准确。在局域网上运行可以测量通信延迟,在发送任务时,您可以在任务开始时添加超时。当您将其发送到N个节点并且平均延迟为L毫秒时,第一个节点在开始之前需要等待(N-1) * L ms,第二个(N-2) * L ms ...等等。最后一个会立即开始。


为了了解同步时钟的问题有多复杂,您可以在Spanner: Google's Globally-Distributed Database上阅读Google的研究论文。他们使用原子钟和GPS时钟在数据中心内在几纳秒内同步,在数据中心内同步几毫秒。