【问题标题】:Simpy get elements that are waiting for a Resource to be freeSimpy 获取正在等待资源释放的元素
【发布时间】:2018-11-11 01:46:22
【问题描述】:

我正在使用 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 方法,但似乎没有任何效果。

我不正确理解这些方法是如何工作的,以及如何实现这一点。 有任何想法吗? 谢谢!

【问题讨论】:

    标签: python simpy


    【解决方案1】:

    经过一些研究和反复试验,我找到了解决方案。 基本上,当您使用“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)
    

    【讨论】:

      猜你喜欢
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多