请教个问题,关于定时器从数据库查询一个数组N多数据,,然后for 按id,分配多个进程进行处理,,但如何防止他们不重复处理。

phoenix

关于一个数组N多数据,定时查询,然后for 按id,分配多个进程进行处理,,但如何防止他们不重复处理。
worker 类
运行定时内获取数据库数据,是个多维数组,如何把数组中每个数据分配一个进程进行处理,处理完后,就行下一轮循环,如何让进程不会重复处理数据,
50条数据
分配给10个进程后,进行处理,发现处理数据的时候有重复。未找到原因

能给解决重复处理数据的思路
2秒查询数据库
$j = count($arr);
while($i<=$j-1){
dotask(arr[$i],option); 执行任务,
$i++
}

767 1 0
1个回答

latin

你没做排重处理当然重复了。
按照进程id取模,只处理取模后等于当前进程id的数据就好了。伪代码

$worker = new Worker();
$worker->count = 10;
$worker->onWorkerStart = function($worker){
     $worker_id = $worker->id;
     $j = count($arr);
     $i = 0;
    while($i<=$j-1){
       // 不是当前进程该处理的任务则忽略
        if ($i != $worker->id) continue;
        dotask(arr[$i],option); 执行任务,
        $i++
    }
}
  • phoenix 2021-10-26

    谢谢,不重复了, 5个进程cpu100,看来还是有些问题。

🔝