通过长队列运行多个工作人员

时间:2010-01-12 05:50:14

标签: php mysql queue

我有一个很长的mysql队列。我有1个工作脚本来处理每个队列。

但是当这个worker正在运行时,可能会更新数据库或获取新的行插入。

示例工作者脚本

get_current_queue = SELECT from queue...

while(get_current_queue) {

update_current_row_from_queue "processing"

//some cpu intensive processing here that takes varying amount of time.

}

问题是工作者脚本需要不同的时间,具体取决于给定时间的队列有多长,以及每个cpu处理需要多长时间(转换视频为ex)。

所以当我在第一个工作脚本运行时运行另一个工作脚本时,第一个工作人员尚未在队列数据库中标记为“处理”的队列将落在第二个工作人员的待办事项列表中。

我不知道如何解决这个问题。

当一个工人运行时,我需要一些方法来标记这个批处理,所以只有这个工人才能运行它。

并且在运行时,插入新行后,如果我选择启动另一个工作程序,它可以正常工作。

2 个答案:

答案 0 :(得分:1)

将表队列中的一个字段用于当前正在处理该行的工作人员ID。

首先做update queue set worker_id = myid Where worker_id = '' LIMIT 100 然后select * from queue where worker_id = myid并处理这些行。 毕竟从队列中删除这些行或将它们标记为已处理。

当您的某个工作人员在处理通过将worker_id设置回''来解锁未处理的行时,您可能需要某种回退来覆盖这种情况。

答案 1 :(得分:1)

卡米尔有一个很好的答案。我建议工人一次只能获得一排。这样,队列将被更紧密地处理它的原始顺序;并且,如果与从数据库中检索行相比,中间的操作确实需要很长时间,那么您不需要一次获得多行。

这也可以更容易地检查工人是否已经死亡。因为每个工人在任何给定时间只能有一个任务。

我实施了一个这样的系统,每周末运行imagemagick处理超过250,00张图像的机器。 (这就是工作进来的时候。)然后我可以在一周内无人可及的情况下关闭工人,随着工作量的增加将他们解雇。像冠军一样工作。