我目前正在尝试使用SimPy为服务计数器建模,但是在使用yield来保存资源时遇到了困难。在Counter.arrive()函数下,如果存在“ yield req”行,则整个函数将跳过执行(至少我认为那是发生的情况,因为我没有得到任何打印输出)。但是,如果我注释掉那一行,代码将执行,没有任何反应。这是一个问题,因为在没有屈服的情况下,直到请求被批准并且直到每个人都可以使用该资源,整个模拟才会失败,代码才被阻塞。
代码片段如下:
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
进行的所有操作)都由simpy处理,因此需要到达simpy进行处理。您告诉simpy使用customer
处理env.process
:
env.process(customer(env,counter, 1))
在
customer
中,您呼叫counter.arrive(name)
。因为arrive
是生成器(由于yield),所以它不执行任何操作,直到有人对其调用next
为止。 Simpy需要了解它才能正确处理它。您应该可以通过以下方式执行此操作:env.process(counter.arrive(name))
这应该可以解决您的问题。
请注意,在此代码中,您也不会释放资源,因此实际上只有一位客户可以到达。
关于python - 请求Simpy资源永远不会成功,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55306821/