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