Simpy Запросы накапливаются в очереди - PullRequest
0 голосов
/ 06 ноября 2018

Я имитирую встречи в конференц-залах и начал с примера банка Renege в качестве модели. Он работает как задумано - эта первая версия просто пытается поместить 5 встреч в 3 комнаты в несколько разных часов. ОДНАКО, я замечаю, что запросы в очереди (те, кто не получает конференц-зал) накапливаются в списке Resource.queue. Не должны ли они освободиться и исчезнуть? Это ошибка с моей стороны? Я пытался
req.cancel simpy.Interrupt и несколько других попыток, безрезультатно.

RANDOM_SEED = 181106
NbrMtgs = 5  # Total number of meetings in a period
INTERVAL = 1.0  # Generate new meetings every x hours

def Schedule(env, NbrMtgs, interval, ResRooms):
    #Source generates meetings
    while True:
        for i in range(NbrMtgs):
            h=env.now
            m = Meet(env, 'Meeting%02d_%02d' % (h,i), ResRooms, TimeInMtg=MtgLen)
            env.process(m)
        t = 1
        yield env.timeout(t)

def Meet(env, name, ResRooms, TimeInMtg):
    #Customer arrives, is served and leaves.
    arrive = env.now
    print('%7.4f %s: Here I am' % (arrive, name))

    with ResRooms.request() as req:
        results = yield req | env.timeout(MtgLen)

        wait = env.now - arrive

        if req in results:
            # We got to the ResRooms
            print('%7.4f %s: Waited %6.3f' % (env.now, name, wait))

            #tib = random.expovariate(1.0 / TimeInMtg)
            yield env.timeout(TimeInMtg)
            print('%7.4f %s: Finished' % (env.now, name))

        else:
            # We reneged
            #req.cancel() this doesnt clear queue and does give an error at last step
            # no notable effect  ResRooms.release(req)
            #simpy.Interrupt('No rooms')  still piling up. no effect
            #yield env.timeout(TimeInMtg)
            print('%7.4f %s: RENEGED after %6.3f' % (env.now, name, wait))
        print("this req=",req)  # is something like   <Request() object at 0x2449892f908>
        print("users",ResRooms.users)
        print("queue",ResRooms.queue)

env = simpy.Environment()

# Start processes and run
ResRooms = simpy.Resource(env, capacity=3)
MtgLen = 1
Hours = 8


env.process(Schedule(env, NbrMtgs, INTERVAL, ResRooms))
env.run(until=5)

1 Ответ

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

Нет, это не ошибка. Если вы запросите ресурсы так, как вы это сделали, с помощью оператора with, то все запросы, которые не получили ресурс, окажутся в очереди и будут ждать, пока ресурс снова не станет доступен. Вы хотите отменить эти запросы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...