Php 通过长QUE运行多个工人

Php 通过长QUE运行多个工人,php,mysql,queue,Php,Mysql,Queue,我有一个长长的mysql队列。我有一个处理每个队列的工作脚本 但是,在该辅助进程运行时,数据库可能会更新或获得新的行插入 示例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 o

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

但是,在该辅助进程运行时,数据库可能会更新或获得新的行插入

示例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)

因此,当我在第一个工作线程运行时运行另一个工作线程脚本时,第一个工作线程在队列数据库中尚未标记为“正在处理”的队列将落在第二个工作线程的todo列表中

我不知道如何处理这个问题

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


在运行时,插入新行后,如果我选择启动另一个辅助进程,它可以工作。

在表队列中为当前正在处理该行的辅助进程id指定一个字段

首先执行更新队列集worker\u id=myid,其中worker\u id=''LIMIT 100 然后
从worker_id=myid的队列中选择*并处理这些行。
毕竟,从队列中删除这些行或将它们标记为已处理


当您的一个工人在处理过程中死亡时,您可能需要某种退后措施,通过将工人id设置回“”,解锁其未处理的行。Kamil有一个很好的答案。我建议工人们一次只能排一排。这样,队列的处理将更接近其原始顺序;而且,如果中间的操作与从数据库中检索行相比需要花费很长的时间,那么您就不需要一次获得多个行。 这也使得检查工人是否死亡变得更容易。因为每个工人在任何给定时间只能有一个任务


我实现了一个这样的系统,每个周末有一堆机器运行imagemagick处理超过25,00张图像。(那时工作机会来了。)然后,我可以在一周无事可做的时候关闭工人,并随着工作量的增加解雇他们。像冠军一样工作。

好吧,你是说每排有一名工人?在任何给定时间,员工的最大运行阈值是多少?如果有很多工人每人只跑一排,那不是效率更低吗?我想听听更多的细节,这很有趣。