Как сделать приоритетный запрос на получение из хранилища ресурсов

Проще говоря, я использую магазин в качестве своего ресурса из-за характера проблемы.

У меня есть несколько запросов на получение товара в магазине. Однако некоторые запросы на получение имеют более высокий приоритет, и я хочу, чтобы они обрабатывались первыми. Я не хочу следовать правилам FIFO для такого специального запроса на получение.

yield Store_item.get()

Я попытался выполнить этот вопрос. Однако я не могу создать подкласс, соответствующий этому требованию.

Я хочу что-то вроде этого: (но это пример приоритетного ресурса, а не ресурса хранилища).

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))
         yield env.timeout(3)

Однако мне это нужно для класса ресурсов хранилища, а не для общего доступа к хранилищу.

Результат будет:

yield Store_item.priority_get()

person Nic    schedule 29.10.2019    source источник


Ответы (1)


Я понимаю, что опаздываю, но это то, что сработало для меня.

Во-первых, определите класс PriorityGet (этот код был адаптирован из источника simpy):

class PriorityGet(simpy.resources.base.Get):

    def __init__(self, resource, priority=10, preempt=True):
        self.priority = priority
        """The priority of this request. A smaller number means higher
        priority."""

        self.preempt = preempt
        """Indicates whether the request should preempt a resource user or not
        (:class:`PriorityResource` ignores this flag)."""

        self.time = resource._env.now
        """The time at which the request was made."""

        self.usage_since = None
        """The time at which the request succeeded."""

        self.key = (self.priority, self.time, not self.preempt)
        """Key for sorting events. Consists of the priority (lower value is
        more important), the time at which the request was made (earlier
        requests are more important) and finally the preemption flag (preempt
        requests are more important)."""

        super().__init__(resource)

Затем соберите свой ресурс PriorityStore:

from simpy.core import BoundClass

class PriorityBaseStore(simpy.resources.store.Store):

    GetQueue = simpy.resources.resource.SortedQueue

    get = BoundClass(PriorityGet)

Никакой метод priority_get не привязан к классу, но вы можете добиться того же результата с помощью .get(priority = 1) (или любого другого числа меньше 10, базового приоритета, определенного в классе PriorityGet). Кроме того, вы можете явно связать метод.

person arabinelli    schedule 28.04.2020