【问题标题】:Requesting a Simpy resource never succeeds请求 Simpy 资源永远不会成功
【发布时间】:2019-03-22 19:44:52
【问题描述】:

我目前正在尝试使用 SimPy 为服务计数器建模,但在使用 yield 来保存资源时遇到了困难。在 Counter.arrive() 函数下,如果存在“yield req”行,则整个函数会跳过执行(至少我认为这是因为我没有得到任何打印输出)。但是,如果我注释掉那一行,代码就会像什么都没发生一样执行。这是一个问题,因为没有 yield 代码在请求被批准之前不会被阻塞,并且整个模拟失败,因为每个人都可以使用该资源。

代码sn-p如下:

import simpy
class Counter:
    def __init__(self, env, name, staff):
        self.env = env
        self.staff = simpy.Resource(env, staff)
        self.name = name
        self.dreq = []
    def arrive(self, name):
        ...
        req = self.staff.request()
        yield req
        output = "Req: %s\n" % req
        self.dreq.append(req)
        ...
        print(output)
...
def customer(env, counter, name):
        print("Customer %s arrived at %s" %(name,env.now))
        counter.arrive(name)
        yield env.timeout(5)
        print("Customer %s left at %s" %(name,env.now))
...
env = simpy.Environment()
counter = Counter(env, "A", 1)
def setup(env, counter, MAX_CUST):
    for i in range(MAX_CUST):
        env.process(customer(env,counter, 1))
        yield env.timeout(1)
env.process(setup(env,counter,5))
env.run(until=100)

编辑:我知道使用 yield 应该暂停该功能,直到请求获得批准,但第一个请求也没有通过,这没有意义,因为一开始就有 1 个可用资源单位。

文档为方便起见:https://simpy.readthedocs.io/en/3.0.6/topical_guides/resources.html

【问题讨论】:

  • 您是否希望yield 之后的行立即执行?当使用yield 时,它之后的任何内容都不会被执行,就像return 一样。执行将在使用 yield 关键字后的行上恢复,但前提是您在第一个 yield 的输出上调用 .next()
  • 不是下一次调用它,而是下一次调用next的返回值。
  • 对不起,我可能需要澄清一下。我知道 yield 应该暂停函数,直到请求获得批准,但第一个请求也没有通过,这没有意义,因为有 1 个可用资源单位。

标签: python yield simpy


【解决方案1】:

请求(和超时以及您需要yield 的所有内容)都由 simpy 处理,因此它需要到达 simpy 才能得到处理。你告诉 simpy 用env.process 处理customer

    env.process(customer(env,counter, 1))

customer 中,您调用counter.arrive(name)。因为arrive 是一个生成器(因为yield),所以它什么都不做,直到有东西调用next。 Simpy 需要知道它才能正确处理它。您应该可以通过以下方式做到这一点:

env.process(counter.arrive(name))

这应该可以解决您的问题。

请注意,同样在此代码中,您永远不会释放资源,因此实际上只有一位客户可以到达。

【讨论】:

  • 这实际上解决了问题!我有一个释放功能,但我故意让它过度使用以查看资源是否被正确阻止
猜你喜欢
  • 2014-06-17
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多