Simpy是什么?
一个pythhon第三方库,可以基于“过程”进行离散事件的仿真。
simpy中,所有的过程都使用python“生成器”来实现,可以对汽车、服务业等包含很多活跃体的情况进行仿真。simpy还支持各种资源的分配(如服务员、隧道等)。
仿真的速度可以是实时的也可以快进。
虽然理论上可以使用simpy进行连续性的仿真,但这样做并不合适。另一方面,如果你的仿真只有一个流程,而且彼此没有交流和资源共享,那使用simpy就是高射炮打蚊子了。
pip安装 常规操作
pip install simpy 首先我们介绍一个关键词:yield
yield和return很类似,区别在于,return给出返回值后,函数会被释放,但yield给出返回值后,函数会被保留,当再次调用时,会从yirld下的一行继续执行。
def fun1():
a = 1
while True:
a += 1
return a
def fun2():
a = 1
while True:
a += 1
yield a 当我们调用fun1()的时候,会得到2。
当我们调用fun2()的时候,会得到一个生成器,它不能被直接执行,需要使用next函数来执行它:
g=fun2()
next(g) # 得到2
next(g) # 得到3
next(g) # 得到4 以钟表为例,做个简单的例子:
# 首先引入库函数
import simpy
# 任何一个过程都必须是一个函数,输入参数为env
def clock(env):
while True:
print("开始:", env.now) # 使用env.now获取当前时间
yield env.timeout(1) # 等待1s
print("结束:", env.now) # 使用env.now获取当前时间
# 第一步,创建env对象,它是simpy仿真的核心
env = simpy.Environment()
# 第二步,启动进程,将一个函数输入process函数,这个函数就会被不断执行
env.process(clock(env))
# 第三步,启动仿真,仿真持续4s
env.run(until=4)
将会输出:
开始: 0
结束: 1
开始: 1
结束: 2
开始: 2
结束: 3
开始: 3 在执行run函数后,程序中的process(被输入process的函数)会被反复调用,每次调用返回(yirld)等待条件(本例中的等待条件是延时1s)。
当然,也可以写两个process:
# 首先引入库函数
import simpy
# 任何一个过程都必须是一个函数
def clock(env,tic):
while True:
print("%f开始:"%tic, env.now) # 使用env.now获取当前时间
yield env.timeout(tic) # 等待1s
print("%f结束:"%tic, env.now) # 使用env.now获取当前时间
# 第一步,创建env对象,它是simpy仿真的核心
env = simpy.Environment()
# 第二步,启动进程,将一个函数输入process函数,这个函数就会被不断执行
env.process(clock(env,1))
env.process(clock(env,0.5))
# 第三步,启动仿真,仿真持续4s
env.run(until=3) 输出为:
1.000000开始: 0
0.500000开始: 0
0.500000结束: 0.5
0.500000开始: 0.5
1.000000结束: 1
1.000000开始: 1
0.500000结束: 1.0
0.500000开始: 1.0
0.500000结束: 1.5
0.500000开始: 1.5
1.000000结束: 2
1.000000开始: 2
0.500000结束: 2.0
0.500000开始: 2.0
0.500000结束: 2.5
0.500000开始: 2.5 这时,两个process是平权的,他们都会被反复调用由于二者没有交叉,所以他们的调用互不影响。