【simpy】光速上手1——简介+helloworld
佩尔方程
2021年05月15日 11:16
收录于文集
共5篇

Simpy是什么?

一个pythhon第三方库,可以基于“过程”进行离散事件的仿真。

simpy中,所有的过程都使用python“生成器”来实现,可以对汽车、服务业等包含很多活跃体的情况进行仿真。simpy还支持各种资源的分配(如服务员、隧道等)。

仿真的速度可以是实时的也可以快进。

虽然理论上可以使用simpy进行连续性的仿真,但这样做并不合适。另一方面,如果你的仿真只有一个流程,而且彼此没有交流和资源共享,那使用simpy就是高射炮打蚊子了。

安装

pip安装 常规操作

代码块
JavaScript
自动换行
复制代码
pip install simpy
复制成功

HELLOWORLD

首先我们介绍一个关键词:yield

yieldreturn很类似,区别在于,return给出返回值后,函数会被释放,但yield给出返回值后,函数会被保留,当再次调用时,会从yirld下的一行继续执行。

代码块
Python
自动换行
复制代码
def fun1():
    a = 1
    while True:
        a += 1
        return a

def fun2():
    a = 1
    while True:
        a += 1
        yield a
复制成功

当我们调用fun1()的时候,会得到2。

当我们调用fun2()的时候,会得到一个生成器,它不能被直接执行,需要使用next函数来执行它:

代码块
Python
自动换行
复制代码
g=fun2()
next(g)   # 得到2
next(g)   # 得到3
next(g)   # 得到4
复制成功

以钟表为例,做个简单的例子:

代码块
Python
自动换行
复制代码
# 首先引入库函数
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)
复制成功

将会输出:

代码块
Python
自动换行
复制代码
开始: 0
结束: 1
开始: 1
结束: 2
开始: 2
结束: 3
开始: 3
复制成功

在执行run函数后,程序中的process(被输入process的函数)会被反复调用,每次调用返回(yirld)等待条件(本例中的等待条件是延时1s)。

当然,也可以写两个process:

代码块
Python
自动换行
复制代码
# 首先引入库函数
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)
复制成功

输出为:

代码块
Python
自动换行
复制代码
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是平权的,他们都会被反复调用由于二者没有交叉,所以他们的调用互不影响。