如何在 cronjobs 中并行获取多个条件的记录



我有一个包含许多艺术家的音乐库应用程序。我想使用多个 cronjobs 并行获取多个艺术家的记录。我正在尝试使用以下代码:

$track_q = $this->DbTracks->find()->where(["enrich_status"=>'pending'])->limit(250);
$tracks = $track_q->all();
/*** using that artists ***/
foreach($tracks as $track){
$artist_q=$this->DbArtists->find()->where(["id"=>$track->artist_id]);
$artist=$artist_q->first();
}

但它一次只能吸引一位艺术家。我想在并行 cronjobs 中获取多个艺术家,做这样的事情:

对于 cronjob one:

$track_q = $this->DbTracks->find()->where(["enrich_status"=>'pending', 'artist_id IN'=>[1,2,3,4,5]])->limit(250);
$tracks = $track_q->all();
//$track->artist_id; die;
foreach($tracks as $track){
$artist_q=$this->DbArtists->find()->where(["id"=>$track->artist_id]);
$artist=$artist_q->first();

对于 cronjob 2:

/*** get records for artists having id 1,2,3,4,5 ***/
$track_q = $this->DbTracks->find()->where(["enrich_status"=>'pending', 'artist_id IN'=>[6,7,8,9,10]])->limit(250);
$tracks = $track_q->all();
/*** using that artists ***/
foreach($tracks as $track){
$artist_q=$this->DbArtists->find()->where(["id"=>$track->artist_id]);
$artist=$artist_q->first();
}

问题是有 1000 个艺术家,那么如何在不指定硬编码 ID 的情况下像上面一样批量管理他们?

您可以在artist_id列上使用模%运算符。

假设您使用的是 Laravel 的 Eloquent 查询构建器,如下所示的内容应该可以工作:

->whereRaw('artist_id % 2 = 0')->limit(250);  // All even artist_ids

。在第二个 cron 作业中:

->whereRaw('artist_id % 2 = 1')->limit(250);  // All odd artist_ids

关于取模运算符的说明:

x % 2表示 x 的余数除以 2。因此,当 x% 2 = 0时,x 必须是偶数。同样,当 x% 2 = 1时,x 必须是奇数。

您可以将同一示例扩展到任意数量的子集。当你想分配 n 个单独的集合时,只需使用artist_id % n ==x,其中x可以是 0 到n-1之间的任何整数。


编辑:

当然,只要artist_id是数字,上述内容才有效。


一般说明:

我不知道你的 cron 作业究竟要对所有艺术家做什么,但这可能是另一种方法:使用 cronjob 仅查询所有艺术家的 id,然后将每个艺术家的单独作业分派到作业队列中。为作业队列分配尽可能多的工作人员,只要您的硬件可以承受

最新更新