【问题标题】:How to get N computers in a network to start an activity simultaneously?如何让网络中的 N 台计算机同时启动一项活动?
【发布时间】:2014-04-23 10:44:06
【问题描述】:

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

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

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 秒,我想要合理的同时性。

【问题讨论】:

  • 您需要它们的同步程度如何? 0.1 秒? 1秒? 10 秒?
  • 我希望它们同步到大约 0.1 秒。正如我所说,每个标签至少会出现 0.1 秒,所以如果您将每个标签视为在屏幕上闪烁的颜色,我想要一种错觉,即所有屏幕都以相同的颜色闪烁相同的持续时间。
  • 为了让人类观察者认为事件是同时发生的,它们可能需要比flicker fusion rate 更快地发生;您可能希望在至少 15Hz 内触发它们,并且在良好照明下可能高达 60Hz;相隔 0.067 到 0.017 秒。仍然完全在 NTP 的能力范围内。

标签: python networking distributed distributed-computing


【解决方案1】:

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

因此,使用公共 NTP 服务器在 100 毫秒内同步是可行的,并且可能是您实现此功能的最简单途径。

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

【讨论】:

    【解决方案2】:

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


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

    【讨论】:

      【解决方案3】:

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

      我看到两个选项:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2015-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多