Запрос ресурса Simpy никогда не удался - PullRequest
1 голос
/ 22 марта 2019

В настоящее время я пытаюсь смоделировать счетчик сервисов с помощью 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

1 Ответ

0 голосов
/ 22 марта 2019

Запросы (и тайм-ауты и все, что вам нужно для yield) обрабатываются Simpy, поэтому для их обработки необходимо получить Simpy. Вы говорите Simpy обрабатывать customer с env.process:

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

В customer вы звоните counter.arrive(name). Поскольку arrive является генератором (из-за выхода), он ничего не делает, пока что-то не вызовет next для него. Симпи должен знать об этом, чтобы правильно его обработать. Вы должны быть в состоянии сделать это:

env.process(counter.arrive(name))

которая должна решить вашу проблему.

Обратите внимание, что и в этом коде вы никогда не освобождаете ресурс, поэтому на самом деле может прибыть только один клиент.

...