如何建立一个小程序相互传递数据的小型网络?

6 投票
8 回答
1303 浏览
提问于 2025-04-15 14:38

我想模拟一个实时网络,这个网络里的节点既是消费者也是生产者,而且它们的速度各不相同。请问我该如何用Python快速实现一个这样的示例呢?我在想是不是可以为每个节点写一个简单的程序,但我不太确定要怎么把它们连接在一起。

8 个回答

2

我喜欢@DigitalRoss和dcrosta提到的离散事件模拟方法,想告诉大家,Python标准库里的sched模块正好适合用在这样的系统里(你不需要在heapq的基础上重新构建核心)。你只需要初始化一个sched.scheduler实例,而不是通常使用的time.timetime.sleep,只需传入两个可以调用的函数来模拟时间的流逝。

例如:

class FakeTime(object):
  def __init__(self, start=0.0):
    self.now = start
  def time(self):
    return self.now
  def sleep(self, delay):
    self.now += delay

mytimer = FakeTime()

然后用s = sched.scheduler(mytimer.time, mytimer.sleep)来创建调度器。

2

进程间通信通常是个比较复杂的事情,很难做到完美。你可以考虑用其他方法来满足你的需求,比如离散事件模拟器。

在离散事件模拟(DES)中,你并不是实际去完成每个节点的工作,而是模拟每个节点完成工作的时间。你可以使用优先队列来跟踪进出工作的情况,并且可以对系统进行监控,以便全局和每个节点都能知道队列的大小。

也许如果你能提供更多关于你想要实现的目标的细节,我们可以给出更具体的建议。

编辑:Python的heapq模块里有一个内置的优先队列,详情请查看 http://docs.python.org/library/heapq.html

5

一开始最好还是用传统的模拟结构

你是想通过写一个异步系统来练习吗?如果是这样,那你至少得实现一个多线程的系统,或者更复杂的多进程或网络系统。

但如果这真的是一个模拟,而你想要的是分析结果,那么实现一个真正的分布式模型会非常复杂,可能得到的数据还不如一个抽象的模拟多。也就是说,模拟本身并不一定要是一个异步的网络系统。这样做只会让问题变得复杂到难以解决。

我建议你还是坚持使用传统的模拟架构。

经典的离散事件模拟

这种方法的核心是有一个按时间排序的待处理事件集合。事件是根据时间的先后顺序自然排序的。

程序有一个主循环,它从集合中取出下一个(也就是时间最早的)事件,把模拟时钟推进到这个事件的时间,然后执行与这个事件相关的任务。

你可能会问,如果在模拟器跳过的时间段内应该发生什么呢?根据定义,那段时间内什么都没有发生。如果模拟中的某个元素需要在那个时间段内发生某件事,它就得自己创建一个事件并把它插入到(排序好的)集合中。

虽然市面上有很多专门用于模拟的软件和程序,但模拟的核心部分其实并不难,完全可以用你喜欢的编程语言从头开始写。

祝你玩得开心!

撰写回答