请求Simpy资源永远不会成功

问题描述 投票:1回答:1

我目前正在尝试使用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

python yield simpy
1个回答
0
投票

请求(和超时以及yield所需的一切)由simpy处理,所以它需要简单到达才能得到处理。你告诉simpy用customer处理env.process

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

customer,你打电话给counter.arrive(name)。因为arrive是一个发电机(因为产量),所以在它上面调用next之前什么都不做。 Simpy需要知道它才能正确处理它。您应该可以通过以下方式执行此操作:

env.process(counter.arrive(name))

哪个应该解决你的问题。

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

© www.soinside.com 2019 - 2024. All rights reserved.