Блокировка (B) ZREVRANGEBYSCORE до оценки соответствия критериям - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь реализовать планировщик, используя 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

Есть идеи о том, как этого достичь?

...