2010-01-12 27 views
1

我有一个很长的mysql队列。我有1个工作者脚本处理每个队列。通过长时间运行多个工人

但是当这个工作者正在运行时,数据库可能会被更新或者得到新的行插入。

示例工人脚本

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的处理花费的时间(视频转换为前)。

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

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

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

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

回答

1

为当前正在处理该行的工作人员标识提供表队列中的一个字段。

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

您可能需要某种回退来覆盖当您的某位工人正在处理通过将worker_id重新设置为“'来解锁未处理的行时死亡的情况。

1

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

这也使得检查工人是否已经死亡更容易。由于每个员工在任何时间只能有一项任务。

我实现了一个像这样的系统,每个周末有大量运行imagemagick处理超过250,00张图片的机器。 (这是工作进行的时间。)然后,我可以在一周内无人关闭的情况下关闭工作人员,并在工作量增加时将其解雇。像冠军一样工作。

+0

好吧,你是指每行的工人?在任何特定时间运行的员工的最高门槛是多少?如果有很多工人每人只运行一行,那么效率会不会更低?我想听听更多关于这个细节的信息,这很有趣。 – ggggggggg

相关问题