Simpy 获取正在等待资源释放的元素
Simpy get elements that are waiting for a Resource to be free
我正在使用 Simpy 和 Python 进行简单的模拟。
我的目标是有一个资源当时可以为1,并计算所有其他等待该资源空闲的进程。
示例:
Person 1 comes, takes the resource. waiting is 0
Person 2 arrives, waits. waiting is 1
Person 3 arrives, waits. waiting is 2
Person 1 leaves, releasing resource, so now Person 2 takes it. waiting is 1
到目前为止,这是我的代码:
import simpy
def env1(env):
res = simpy.Resource(env,capacity=1)
while True:
yield env.timeout(5)
print("Arriving Person at ",(env.now))
env.process(getResource(env, res))
def getResource(env,res):
with res.request() as req:
yield req
print("Person using resource at ", env.now)
yield env.timeout(20)
print("Leaving at ", env.now)
调用模拟
env = simpy.Environment()
env.process(env1(env))
env.run(until=500)
我试过使用 .get_queue 方法,但它总是空的。
使用 .queue 似乎总是添加元素,但从不从队列中删除它们。
我也尝试过使用 put 和 release 方法,但似乎没有任何效果。
我没有正确理解这些方法是如何工作的,以及如何实现的。
有任何想法吗?
谢谢!
经过一些研究和 trial/error,我找到了解决方案。
基本上,当您使用 "with res.request() as" 语句时,您让 put/release 交互自行完成,这有助于避免错误。
为了获取队列状态或与之交互,您只需在 with 语句之后调用它:(因为元素将在 with 语句之后位于资源队列中)
import simpy
def env1(env):
res = simpy.Resource(env,capacity=1)
while True:
yield env.timeout(5)
print("Arriving Person at ",(env.now))
env.process(getResource(env, res))
def getResource(env,res):
with res.request() as req:
print("QUEUE SIZE: ",len(res.queue))
yield req
print("Person using resource at ", env.now)
yield env.timeout(20)
print("Leaving at ", env.now)
我正在使用 Simpy 和 Python 进行简单的模拟。 我的目标是有一个资源当时可以为1,并计算所有其他等待该资源空闲的进程。
示例:
Person 1 comes, takes the resource. waiting is 0
Person 2 arrives, waits. waiting is 1
Person 3 arrives, waits. waiting is 2
Person 1 leaves, releasing resource, so now Person 2 takes it. waiting is 1
到目前为止,这是我的代码:
import simpy
def env1(env):
res = simpy.Resource(env,capacity=1)
while True:
yield env.timeout(5)
print("Arriving Person at ",(env.now))
env.process(getResource(env, res))
def getResource(env,res):
with res.request() as req:
yield req
print("Person using resource at ", env.now)
yield env.timeout(20)
print("Leaving at ", env.now)
调用模拟
env = simpy.Environment()
env.process(env1(env))
env.run(until=500)
我试过使用 .get_queue 方法,但它总是空的。 使用 .queue 似乎总是添加元素,但从不从队列中删除它们。 我也尝试过使用 put 和 release 方法,但似乎没有任何效果。
我没有正确理解这些方法是如何工作的,以及如何实现的。 有任何想法吗? 谢谢!
经过一些研究和 trial/error,我找到了解决方案。 基本上,当您使用 "with res.request() as" 语句时,您让 put/release 交互自行完成,这有助于避免错误。
为了获取队列状态或与之交互,您只需在 with 语句之后调用它:(因为元素将在 with 语句之后位于资源队列中)
import simpy
def env1(env):
res = simpy.Resource(env,capacity=1)
while True:
yield env.timeout(5)
print("Arriving Person at ",(env.now))
env.process(getResource(env, res))
def getResource(env,res):
with res.request() as req:
print("QUEUE SIZE: ",len(res.queue))
yield req
print("Person using resource at ", env.now)
yield env.timeout(20)
print("Leaving at ", env.now)