Приоритеты: stati c, но есть способ, который вы можете сделать, чтобы пересчитать все приоритеты на основе этого веса или других атрибутов. Идея состоит в том, что поступающие должны подписаться на сигнал, который запускает пересчет приоритетов, который должен быть повышен при поступлении, которое собирается освободить ресурс. Ключевое действие - renege_if()
, которое заставляет прибытие покинуть очередь и следовать за обработчиком сигнала. Например:
traj <- trajectory() %>%
# ...
renege_if(
"recompute priority",
out = trajectory() %>%
set_prioritization(function() {
# check attributes using get_attribute()
# then, return the new prioritization values
}) %>%
# go 2 steps back to renege_if
rollback(2)) %>%
seize("your resource") %>%
renege_abort() %>%
timeout(some_task) %>%
# trigger this before releasing the resource
send("recompute priority") %>%
timeout(0) %>%
release("your resource") %>%
# ...
Каждый поступающий подписывается на сигнал «пересчитать приоритет» и пытается захватить ресурс. Те, кто находится в очереди, в конечном итоге получат сигнал, последуют за обработчиком сигнала, чтобы установить новый приоритет, а затем откатятся до той же ситуации, что и раньше: они снова подписываются на сигнал и входят в очередь. Но теперь ресурс освобожден, поэтому ресурс с наивысшим приоритетом захватит ресурс.
Обновление: см. этот раздел о реализации пользовательских политик обслуживания.