Python应用程序是可以支持面向过程的编程也支持面向对象的编程,在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的,希望本文能给大家带来帮助。
SimPy 库只提供了三个抽象/父类,并且它们对应于模拟的三个基本概念。有许多其它常规函数和常量用于控制模拟的运行,但重要的概念都与这些类结合在一起。模拟中的核心概念是进程。一个进程只是一个对象,它完成某些任务,随后在它准备完成下一个任务之
前有时会等待一会儿。在 SimPy 中,您还可以“钝化”进程,这意味着在一个进程完成一个任务后,只有当其它进程要求该进程完成其它任务时,它才会去做。把进程当作尝试完成一个目标,常常是很有用的。在编写进程时,通常把它编写成可以在其中执行多个操作的循环。
在每个操作之间,可以插入 Python应用程序语句,它让模拟调度程序在返回控制之前执行每个等待进程的操作。进程执行的许多操作取决于资源的使用。资源只是在可用性方面受到限制。
在生物学模型中,资源可能是食物供应;在网络模型中,资源可以是路由器或有限带宽通道;在我们的市场模拟中,资源是付款通道。资源执行的唯一任务是在任何给定的时间内将它的使用限于一个特定的进程上。
在 SimPy 编程模型下,进程单独决定它要保留资源的时间有多长,资源本身是被动的。在实际系统中,SimPy 模型可能适合概念性方案,也可能不适合;很容易想象到资源在本质上会限制其利用率(例如,如果服务器计算机在必需的时间帧内没有获得满意的响应,则它会中断连接)。
但作为编程问题,进程或资源是否是“主动”方就不是特别重要(只要确保您理解了您的意图)。***一个 SimPy 类是监控程序。实际上监控程序不是很重要,只不过它很方便。监控程序所做的全部任务就是记录向它报告的事件,并保存有关这些事件的统计信息(平均值、计数、方差等)。
该库提供的Python应用程序对记录模拟措施是个有用的工具,但您也可以通过您想使用的其它任何技术来记录事件。事实上,我的示例使 Monitor 子类化,以提供某些(稍微)增强的能力。
在我所撰写的大部分文章中,我都会马上给出样本应用程序,但在本例中,我认为带您经历食品杂货店应用程序的每个步骤会更有用。如果您愿意的话,可以把每个部分剪贴在一起;SimPy 创造者们将在将来的发行版中包含我的示例。
有些 SimPy 附带的示例使用 import * 样式。但我更喜欢使我填充的名称空间更清晰。对于 Python应用程序(SimPy 所需的***版本),将需要如指出的那样,导入生成器特性。对于 Python 2.3 以后的版本,不需要这样做。
对于我的应用程序,我定义了几个运行时常量,它们描述了在特定的模拟运行期间我感兴趣的几个方案。在我更改方案时,我必须在主脚本内编辑这些常量。要是这个应用程序的内容更充实。
那么我就可能用命令行选项、环境变量或配置文件来配置这些参数。但就目前而言,这个样式已经足够了:
我们的模拟需要完成的主要任务是定义一个或多个进程。对于模拟食品杂货店,我们感兴趣的进程是在通道处付款的顾客。
【编辑推荐】