我正在使用Simpy和Python进行简单的仿真。 我的目标是拥有一个当时可以为1的资源,并计算所有其他等待该资源释放的进程。
示例:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input id="submit" type="submit" value="Continue" />
</form>
到目前为止,这是我的代码:
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)
我尝试使用.get_queue方法,但它始终为空。 使用.queue似乎总是添加元素,但从不将其从队列中删除。 我也尝试过使用put和release方法,但是似乎没有任何效果。
我不正确地理解此方法如何工作以及如何实现。 有任何想法吗? 谢谢!
答案 0 :(得分:0)
经过一番研究和反复尝试后,我找到了解决方案。 基本上,当您使用“ with res.request()as”语句时,可以让放置/释放交互本身完成,这有助于避免错误。
为了获取队列状态或与之交互,您只需要在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)