笔趣阁(xbiquge2345.com)更新快,无弹窗!
第一卷少年游第八十八章异步(第1/2页)
第二天早晨,顾老师没有给十五个人发新题,只让他们把前一天下午没做完的那道电磁问题带回来。
黑板上还是那张已经被他拆得很难看的区域图:边界弯弯曲曲,材料性质在不同位置也不一样,原先那些能让计算一下子变漂亮的对称条件几乎全被拿掉了。昨天江遥最后留下的想法,是把整个区域拆成许多小块,每一个小块只处理附近的信息,再让相邻区域彼此传递结果。她回宿舍以后又想过一阵,觉得这个办法至少有一个很直观的好处:如果一张巨大的地图难以一次看清,也许可以让许多人各守一小块地,每个人只和邻居交换消息,最后慢慢拼出整张地图。
顾老师开课以后却没有让他们继续算,而是在黑板上画了六个圆点,用线把相邻的点连起来。
“现在不谈电磁。”他说,“假设这六个人各自有一个数字,而且谁也看不见全局。每个人只能和直接相连的邻居说话。我们希望过一段时间以后,他们都得到同一个数,这个数接近六个人最初数字的平均值。你们会怎么做?”
这个问题一下子简单了许多。有人马上说,每个人把自己的数字告诉邻居,再取平均;下一轮继续交换,反复做下去,差距就可能越来越小。顾老师让他们真的试。六个人各代表一个点,把自己的数字写在纸上,每一轮只允许看左右相邻者,再更新一次。开始时有人是二,有人是十九,有人是负三,几轮以后,最大的数开始往下走,最小的数开始往上走,原来相差很大的六张纸渐渐靠到一起。
韩思遥不在核心组,这种课堂少了她一句“大家最后都变得没个性了”,反倒让江遥觉得有点安静。她看着那些数字逐渐接近,很容易理解这里发生了什么:没有任何人知道六个数的总和,也没有一个中央裁判负责计算平均值,可每个人只根据局部邻居做一点调整,整体依然可能慢慢达成一致。
顾老师等他们做完,忽然问:“如果不是所有人同时更新呢?”
有人抬头。
“什么意思?”
“刚才我喊一、二、三,你们一起看邻居,一起算,一起写新数。现在不喊了。有人算得快,有人算得慢;有人这轮已经写了新数,旁边那个人还拿着上上一轮的数据。消息传过去也可能晚一点。还会不会收敛?”
教室里一下安静下来。
江遥第一反应觉得应该还是会,只不过慢一些,可真正模拟起来马上出了问题。六个人不再统一听口令,而是各自按照自己“收到”的最新数字更新。有人两秒一次,有人五秒一次,顾老师还故意扣下一两张传递纸条,隔一会儿才递出去。整个过程立刻变得混乱:某个人刚把自己的值往十调整,邻居却还拿着他几分钟前的五继续计算;另一个人连续更新两次后,旁边的人才收到第一条消息。纸面上再也没有整齐的一轮、一轮,只有一串互相穿插的变化。
“现在谁能告诉我这是第几轮?”顾老师问。
没人能回答。
因为“第几轮”这个东西已经不存在了。
江遥突然觉得这个变化比前面的计算本身更有意思。刚才所有人同时更新时,他们其实偷偷拥有了一个全局时钟。虽然没有人知道全局数值,却至少知道现在大家都在进行同一步。这个条件太自然,以至于第一遍做题的时候几乎没人把它当成条件。等顾老师把统一节奏拿掉,他们才发现,所谓“只靠局部信息”还远远不够;你甚至不能默认别人和你生活在同一个时刻。
六个人又试了几轮。数值仍然有逐渐接近的趋势,但速度明显慢了,有时还会短暂往反方向走。一个节点刚接近大家,收到一条迟到的旧消息以后又被拉开。许观澜提出给每条消息加上时间标记,至少让接收者知道这是不是旧信息;陆徊则说,如果所有旧消息都直接丢掉,会不会有些节点因为网络太慢,长时间几乎不参与。简宁很快发现,真正的问题已经不是“怎么算平均值”,而是“在不知道别人什么时候更新、消息什么时候到的情况下,什么规则还能保证大家最后不要彻底跑散”。
江遥开始在灰色本子上画时间线。
她没有急着写公式,只画六条横线,每一条代表一个节点。某条消息从第一条线上发出,过了一段时间才落到第三条线上;另一条消息稍晚发出却先到。图画完以后,原本看起来抽象的“异步”突然变得像生活里极常见的事:两个人同时给第三个人发消息,先发的不一定先被看见;一个人正在依据旧信息做决定时,另一个人的状态可能已经变了。
顾老师这时才在黑板角落写下“异步”两个字。
他没有讲任何正式定义,只说:“真实系统经常没有一个人站在外面喊一、二、三。不同部分各做各的,消息也有延迟。如果一个办法只有所有人同时动作才成立,那它能用的地方会少很多。”