Simpy получить элементы, которые ждут, чтобы ресурс был свободен - PullRequest
0 голосов
/ 11 ноября 2018

Я работаю с простой симуляцией с Simpy и Python. Моя цель - иметь ресурс, который может быть 1 за один раз, и подсчитать все остальные процессы, ожидающие освобождения этого ресурса.

Пример:

 Person 1 comes, takes the resource. waiting is 0
 Person 2 arrives, waits. waiting is 1 
 Person 3 arrives, waits. waiting is 2
 Person 1 leaves, releasing resource, so now Person 2 takes it. waiting is 1 

Это мой код:

import simpy

def env1(env):
    res = simpy.Resource(env,capacity=1)
    while True:  
        yield env.timeout(5)
        print("Arriving Person at ",(env.now))
        env.process(getResource(env, res))

def getResource(env,res):
        with res.request() as req:
            yield req
            print("Person using resource at ", env.now)
            yield env.timeout(20)
            print("Leaving at ", env.now)

Вызов симуляции

env = simpy.Environment()
env.process(env1(env))
env.run(until=500)

Я пытался использовать метод .get_queue, но он всегда пуст. Использование .queue, кажется, всегда добавляет элементы, но никогда не удаляет их из очереди. Я также пытался использовать методы put и release, но, похоже, ничего не работает.

Я не правильно понимаю, как работают эти методы и как этого добиться. Есть идеи? Спасибо!

1 Ответ

0 голосов
/ 12 ноября 2018

После некоторых исследований и проб / ошибок я нашел решение. По сути, когда вы используете оператор «с res.request () как», вы позволяете взаимодействию put / release выполняться самостоятельно, что помогает избежать ошибок.

Чтобы получить состояние очереди или взаимодействовать с ней, достаточно вызвать его только ПОСЛЕ оператора with: (поскольку элемент будет находиться в очереди ресурсов ПОСЛЕ оператора with)

import simpy

def env1(env):
    res = simpy.Resource(env,capacity=1)
    while True:  
        yield env.timeout(5)
        print("Arriving Person at ",(env.now))
        env.process(getResource(env, res))

def getResource(env,res):
        with res.request() as req:
            print("QUEUE SIZE: ",len(res.queue))
            yield req
            print("Person using resource at ", env.now)
            yield env.timeout(20)
            print("Leaving at ", env.now)
...