描述
使用基于Python的SimPy仿真工具,实现《操作系统原理》课程中较为简单的进程同步问题——“生产者-消费者”模型
准备工作
- Python:2.7版本以上即可
- SimPy:本实验基于2.3.1版本
pip install SimPy==2.3.1
- 学习SimPy中 yield waituntil 语法
参考程序
import SimPy.Simulation as Simulation
import random
ls=[]
#本程序模拟了一个进程同步问题,“生产者-消费者”问题。一个生产者往ls中送产品,一个消费者从ls中取出产品
class Consumer(Simulation.Process):
def __init__(self,name):
Simulation.Process.__init__(self, name=name)
def Get(self):
def have_goods():
return len(ls)>0
while True:
yield Simulation.waituntil,self,have_goods
use_Time=random.randint(3,5)
print("[Consumer]\tNow {0} Get Elements {1},will use {2} seconds".format(\
Simulation.now(),ls.pop(0),use_Time))
yield Simulation.hold,self,use_Time
class Producer(Simulation.Process):
def __init__(self,name,maxProduceAmount=5,maxQueueLength=3):
Simulation.Process.__init__(self, name=name)
self.maxProduceAmount=maxProduceAmount
self.maxQueueLength=maxQueueLength
def Put(self):
i=0
def have_empty():
return self.maxQueueLength-len(ls)>0
while i<=self.maxProduceAmount:
yield Simulation.waituntil,self,have_empty
produce_next_Time=random.randint(1,2)
if i+1>self.maxProduceAmount:
print("[Producer]\tNow {0} Put Elements {1}".format( \
Simulation.now(), i))
else:
print("[Producer]\tNow {0} Put Elements {1},then {2} seconds later will put {3}".format(\
Simulation.now(), i,produce_next_Time,i+1))
ls.append(i)
i+=1
yield Simulation.hold,self,produce_next_Time
Simulation.initialize()
Sim_util=200
pro=Producer(name="pro")
Simulation.activate(pro,pro.Put(),at=0.0)
cus=Consumer(name="cus")
Simulation.activate(cus,cus.Get(),at=0.0)
Simulation.simulate(until=Sim_util)
print("Programe End At:{0}".format(Simulation.now()))
程序运行结果
[Producer] Now 0 Put Elements 0,then 1 seconds later will put 1
[Consumer] Now 0 Get Elements 0,will use 4 seconds
[Producer] Now 1 Put Elements 1,then 1 seconds later will put 2
[Producer] Now 2 Put Elements 2,then 1 seconds later will put 3
[Producer] Now 3 Put Elements 3,then 2 seconds later will put 4
[Consumer] Now 4 Get Elements 1,will use 3 seconds
[Producer] Now 5 Put Elements 4,then 2 seconds later will put 5
[Consumer] Now 7 Get Elements 2,will use 5 seconds
[Producer] Now 7 Put Elements 5
[Consumer] Now 12 Get Elements 3,will use 3 seconds
[Consumer] Now 15 Get Elements 4,will use 4 seconds
[Consumer] Now 19 Get Elements 5,will use 3 seconds
Programe End At:22