Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何建立一个小型程序的迷你网络,互相传送数据?_Python_Simulation - Fatal编程技术网

Python 如何建立一个小型程序的迷你网络,互相传送数据?

Python 如何建立一个小型程序的迷你网络,互相传送数据?,python,simulation,Python,Simulation,我试图模拟一个实时网络,其中节点是不同速率的消费者和生产者。如何使用Python快速实现此示例?我想象我会为每个节点编写一个简单的程序,但我不知道如何将它们相互连接。查看用于创建和操作网络的Python库。编辑:PyGraphviz是一个显示图形的实用程序,位于NetworkX附近/与NetworkX相关,也位于Los Alamos NL。感谢您向las3jrock指出我最初的链接是错误的 您可以按原样使用NetworkX,也可以从这个库中获得灵感(我不会打扰这个库是否真的有网络模拟所需的“万物

我试图模拟一个实时网络,其中节点是不同速率的消费者和生产者。如何使用Python快速实现此示例?我想象我会为每个节点编写一个简单的程序,但我不知道如何将它们相互连接。

查看用于创建和操作网络的Python库。编辑:PyGraphviz是一个显示图形的实用程序,位于NetworkX附近/与NetworkX相关,也位于Los Alamos NL。感谢您向las3jrock指出我最初的链接是错误的

您可以按原样使用NetworkX,也可以从这个库中获得灵感(我不会打扰这个库是否真的有网络模拟所需的“万物图”)。在任何情况下,这种类型的图的创建和操作都将允许您表示(和增长/收缩/进化)网络

如前所述,使用基于图形库的单一集中式对象/服务,只需创建一个(或多个)类来表示网络节点的行为

然后,根据您的需要,如果网络相对较小,则可以有效地“释放”网络节点,并在线程内部运行。或者(对于模拟来说,这通常很容易管理),可以有一个集中式方法,迭代节点,并在适当的时候调用它们的“do_it”方法。如果这种集中式控制器的“刷新率”足够高,则可以使用节点级别的实时时钟来确定何时应触发节点的特定行为。这种模拟可以是事件驱动的,也可以是简单的轮询(同样,如果刷新周期相对于时钟的基本时间单位足够低的话)

网络的集中“地图”将提供网络节点执行其“工作”(无论是什么)所需的各种网络相关原语。换句话说,节点可以从“映射”中查询其直接邻居的列表、完整网络的目录、到任何给定节点的路由(及其成本)等

或者,网络的结构可以分布在网络本身的节点上,即互联网。这种分散的方法有几个优点,但它意味着向节点添加逻辑和数据,以便它们实现等同于DNS和路由的功能。这种方法还有一个缺点,即要求节点之间相当数量的通信量与网络拓扑的发现和维护有关,而不是与网络要模拟的通信/交换的任何语义有关。简而言之,我不建议使用这种分散的方法,除非手头的模拟旨在研究这种分布式网络管理系统的协议

编辑:


几份答复中建议的DES方法肯定解决了问题的模拟部分。如果问题的网络部分很重要,那么实现基于强图形库的虚拟网络将是解决方案的重要部分。这种方法将更容易地揭示与网络拓扑相关的系统动态。

以下是如何制作基本的客户端/服务器程序:

对于从一个发送到另一个的数据,我建议使用有史以来最简单的格式。 如果要在python上实现它,请选中simplejson:

进程间通信通常很难正确进行。你可能想考虑另一种方法是否满足你的需要,比如离散事件模拟器。 在DES中,您实际上并不做每个节点的工作,只需模拟每个节点完成工作所需的时间。您可以使用优先级队列来跟踪传入和传出的工作,并指示系统全局跟踪每个节点的队列大小

也许如果你能提供更多关于你想要完成的事情的细节,我们可以给出更具体的建议

Edit:Python在
heapq
模块中有一个内置的优先级队列,请参阅。

至少首先要坚持传统的模拟结构 您的目标是编写一个异步系统作为练习吗?如果是这样的话,那么我想您至少必须实现一个多线程(如果不是多进程或网络)系统

但是如果它真的是一个模拟,并且你想要的是分析结果,那么实现一个实际的分布式模型将是一个非常复杂的方法,它产生的数据可能比抽象模拟要少得多,也就是说,模拟本身不必是一个异步参与者通信的网络。这将是一个很好的办法,使问题变得如此困难,以至于无法解决

我说,坚持传统的模拟架构

经典离散事件仿真 其工作方式是,作为一个中心数据结构,您有一个已排序的挂起事件集合。事件自然地按时间的增加进行排序

程序有一个主循环,在该循环中,它从集合中取出下一个(即,值最低的)事件,将模拟时钟提前到该事件的时间,然后调用与该事件相关联的任何特定于任务的处理

但是,你会问,如果在模拟器刚刚跳过的时间增量中发生了什么事情呢?嗯,根据定义,什么都没有。如果模拟的单个元素需要在该时间间隔内发生某些事情,则它负责分配事件并将其插入(排序的)集合中

虽然有很多软件包和程序都是面向仿真的,但仿真的勇气并不是那么难,而且是完美的
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()
'/'.join(['http:/', 'us.pycon.org', '2009', 'tutorials', 'schedule', '1PM6/'])