#php #performance #redis #publish-subscribe
#php #Производительность #redis #опубликовать-подписаться
Вопрос:
У меня есть клиент Redis, которому необходимо разделить / сопоставить задание, скажем, между 3 работниками. Предположим, задание состоит из 3 задач. Я хочу распределить их таким образом, чтобы 3 из них выполнялись параллельно и задание занимало всего (приблизительно) 1/3 времени выполнения. Есть ли какой-нибудь способ сделать это с помощью самого Redis? Я не нашел ни одного.
Ответ №1:
Вы можете использовать redis для создания очереди задач. Например, у вас может быть главный процесс, отправляющий задачи в очередь задач, а затем заставляющий работников постоянно опрашивать очередь задач на предмет новой работы.
Основной псевдокод:
while(1)
if some_condition
redis.rpush "tasks", "task1"
redis.rpush "tasks", "task2"
redis.rpush "tasks", "task3"
end
sleep 5
end
Псевдокод рабочего:
while(1)
# blpop blocks until there is an element in "tasks"
task = redis.blpop("tasks", 0)[1]
perform task
end
Комментарии:
1. Я бы использовал
blpop
вместоlpop
в worker.blpop
блокируется до тех пор, пока в очереди не появится что-то, что позволяет избежать ожидания занятости.2. @Theo спасибо за совет! Это немного упрощает рабочий код.
3. Спасибо. Я тоже задавал этот вопрос в redis list. Есть несколько ответов, которые не используют Pub / Sub, но одинаково полезны. groups.google.com/group/redis-db/browse_thread/thread /…
4. @mixdev Правильно, это не решение для pub / sub. Я думаю, вы хотели бы использовать pub / sub только в том случае, если всем работникам необходимо получить одну и ту же задачу при размещении в очереди. Однако, похоже, это не соответствует вашему варианту использования.