为了账号安全,请及时绑定邮箱和手机立即绑定

Simpy 获取正在等待资源可用的元素

Simpy 获取正在等待资源可用的元素

犯罪嫌疑人X 2021-08-14 16:51:36
我正在使用 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 simpydef 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 方法,但似乎没有任何效果。我不正确理解这种方法是如何工作的,以及如何实现这一点。有任何想法吗?谢谢!
查看完整描述

1 回答

?
森栏

TA贡献1810条经验 获得超5个赞

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


查看完整回答
反对 回复 2021-08-14
  • 1 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信