我有一个很长的 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 转换视频)。
因此,当我在第一个工作脚本运行时运行另一个工作脚本时,队列数据库中尚未被第一个工作人员标记为“正在处理”的队列将落入第二个工作人员的待办事项列表中。
我不知道如何解决这个问题。
当一个 worker 运行时,我需要一些方法来标记这个批处理,以便只有这个 worker 会运行它。
当它运行时,在插入新行后,如果我选择启动另一个 worker,它就可以工作。
最佳答案
在表队列中为当前正在处理该行的工作人员 ID 分配一个字段。
首先执行 update queue set worker_id = myid Where worker_id = '' LIMIT 100
然后 select * from queue where worker_id = myid
并处理这些行。
毕竟从队列中删除这些行或将它们标记为已处理。
当您的一名工作人员在通过将 worker_id 设置回“”来解锁未处理的行时死亡时,您可能需要某种回退来应对这种情况。
关于php - 通过长队列运行多个工作人员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2046955/