【发布时间】: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 个可用资源单位。