Я пытаюсь реализовать планировщик, используя Redis , но хотел бы предотвратить вытягивание и вместо этого "блокировать", пока счет не совпадет при использовании ZREVRANGEBYSCORE
что-то вроде BRPOPLPUSH
.
Для тестирования я создаю отсортированный набор, используя в качестве оценки метку времени Unix, что-то вроде этого:
zadd queue <timestamp> <payload>
Чтобы получить только те задачи, которые необходимо использовать, задачи с отметкой времени ниже или равной <NOW_timestamp>
:
tasks = ZREVRANGEBYSCORE queue <NOW_timestamp> 0
Для каждой задачи в задачах я добавляю их в очередь to_do
, например
LPUSH to_do task
Наконец, у меня есть работник, использующий BRPOPLPUSH
, который перемещает задачу из to_do
и добавляет ее в очередь in_progress
:
BRPOPLPUSH to_do in_progress 0
Это работает, но я хотел бы знать, есть ли способ сделать что-то похожее на BRPOPLPUSH
, но с ZREVRANGEBYSCORE
, чтобы я мог избегать частых вызовов или вызовов:
for {
# every X seconds
ZREVRANGEBYSCORE queue <NOW_timestamp> 0
....
}
Кроме того, одним выстрелом переместите задачи, соответствующие желаемому счету, в другую очередь, которую можно использовать BRPOPLPUSH
.
Цель этого состоит в том, что я хотел бы ускорить диспетчеризацию задач и быть более точным, по крайней мере, в порядке секунд, чтобы гарантировать время выполнения задач, например, если задача запланирована на работать в 13:37
, но если я пул каждые 10 секунд, задача может быть выполнена между 13:37
и 13:47
, но не точно в 13:37
Есть идеи о том, как этого достичь?