ジョーは良いアプローチをしていますが、私は現在使用している別のソリューションを見つけました。基本的には、私は2つのコマンド、1つのコントロールと1つのワーカーコマンドを持っています。制御コマンドは、バックグラウンド・プロセスを開始し、その結果をチェックします:ます$ this->パラレルは私が私の8コアのマシン上の6に設定した変数です
protected function process($worker, $entity, $timeout=60) {
$min = $this->em->createQuery('SELECT MIN(e.id) FROM BM2SiteBundle:'.$entity.' e')->getSingleScalarResult();
$max = $this->em->createQuery('SELECT MAX(e.id) FROM BM2SiteBundle:'.$entity.' e')->getSingleScalarResult();
$batch_size = ceil((($max-$min)+1)/$this->parallel);
$pool = array();
for ($i=$min; $i<=$max; $i+=$batch_size) {
$builder = new ProcessBuilder();
$builder->setPrefix($this->getApplication()->getKernel()->getRootDir().'/console');
$builder->setArguments(array(
'--env='.$this->getApplication()->getKernel()->getEnvironment(),
'maf:worker:'.$worker,
$i, $i+$batch_size-1
));
$builder->setTimeout($timeout);
$process = $builder->getProcess();
$process->start();
$pool[] = $process;
}
$this->output->writeln($worker.": started ".count($pool)." jobs");
$running = 99;
while ($running > 0) {
$running = 0;
foreach ($pool as $p) {
if ($p->isRunning()) {
$running++;
}
}
usleep(250);
}
foreach ($pool as $p) {
if (!$p->isSuccessful()) {
$this->output->writeln('fail: '.$p->getExitCode().'/'.$p->getCommandLine());
$this->output->writeln($p->getOutput());
}
}
}
、それが起動するプロセスの数を意味します。このメソッドでは、特定のエンティティ(それによって分割されます)を反復処理する必要があることに注意してください。これは、使用例では常にtrueです。
これは完璧ではありませんが、スレッドの代わりに完全に新しいプロセスを開始します。私はこれをより良いソリューションと考えています。
workerコマンドは、最小ID番号と最大ID番号を取り、その2つの間のセットの実際の作業を行います。
このアプローチは、データセットが合理的によく分散されている限り機能します。 1-1000の範囲にデータがないが、1000と2000の間のすべてのIDが使用されている場合、最初の3つのプロセスは何もしません。
出典
2015-12-28 22:55:22
Tom
phpは本当にマルチスレッド用に設計されていないため、pthreadsのドキュメントにはそれに関する顕著な警告があります。より簡単なオプションは、すべてのタスクをキューにプッシュし、x個のプロセス(exec)を起動してキューにサービスを提供することです。別のオプションは、タスクを(taskcount/x)のグループに分割し、再びxプロセスを開始し、各プロセスにグループを渡すことです。 – Steve
オブジェクトの所与の量のスレッドがあるかどうかわからない場合は、あなたが多くのオブジェクトを持っていて、あなたのプログラムがより速くなるのではなく、より遅くなるならば、 IMHOあなたが見つけた例でスレッドが修正された理由 – Freelancer
私はこれをあなたに提案できますか? https://github.com/facile-it/paraunit私はmantainerです、私はSymonfy Processを使いました。あなたのユースケースではないかもしれませんが、多分それはあなたに頭のスタートを与えることができます...またはあなたはhttps://github.com/liuggio/fastestを見てみることができます – Jean