我有一个包含许多艺术家的音乐库应用。我想使用多个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二:
/*** 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的情况下如上所述管理它们?
答案 0 :(得分:0)
您可以在%
列上使用模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然后再发送一个单独的每个艺术家的工作进入工作队列。根据需要为作业队列分配多个工作人员,并且硬件可以支持。