Простой способ возобновить вытесненный процесс после обработки причины вытеснения - PullRequest
0 голосов
/ 27 января 2020

Я изучаю моделирование дискретных событий с помощью Simpy, у меня есть некоторые проблемы, связанные с вытесняющими ресурсами, мне нужно, как возобновить вытесненный процесс после обработки (прерывания процесса), вот мой код:

import simpy 
def resource_user(name, env, resource, wait, prio):
    yield env.timeout(wait)
    with resource.request(priority=prio) as req:
        print('%s requesting at %s with priority=%s' % (name, env.now, prio))
        yield req
        print('%s got resource at %s' % (name, env.now))
        try:
            yield env.timeout(3)
        except simpy.Interrupt as interrupt:
            by = interrupt.cause.by
            usage = env.now - interrupt.cause.usage_since
            print('%s got preempted by %s at %s after %s' %
                (name, by, env.now, usage))

env = simpy.Environment()
res = simpy.PreemptiveResource(env, capacity=1)
p1 = env.process(resource_user(1, env, res, wait=0, prio=0))
p2 = env.process(resource_user(2, env, res, wait=1, prio=0))
p3 = env.process(resource_user(3, env, res, wait=2, prio=-1))
env.run()

1 Ответ

1 голос
/ 24 апреля 2020

Используйте некоторое время l oop и уточните, сколько времени еще предстоит сделать:

    import simpy 
    def resource_user(name, env, resource, wait, prio):
        yield env.timeout(wait)
        timeLeft = 3
        while timeLeft>0:
            with resource.request(priority=prio) as req:
                print('%s requesting at %s with priority=%s' % (name, env.now, prio))
                yield req
                print('%s got resource at %s' % (name, env.now))
                try:
                    yield env.timeout(timeLeft)
                    timeLeft = 0
                    print('%s completed at time %g' % (name, env.now))
                except simpy.Interrupt as interrupt:
                    by = interrupt.cause.by
                    usage = env.now - interrupt.cause.usage_since
                    timeLeft -= usage
                    prio -= 0.1 #bump my prio enough so I'm next
                    print('%s got preempted by %s at %s after %s' %
                           (name, by, env.now, usage))

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

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