我仍然相对较新的PHP并尝试使用pthreads来解决问题。我有20个线程正在运行以不同时间结束的进程。大多数完成< 10秒左右。我不需要全部20个,只检测到10个。一旦我达到10,我想杀死线程,或者继续下一步。
我已经尝试将set_time_limit用于每个线程大约20秒,但是他们忽略它并继续运行。我正在寻找连接的作业循环,因为我不希望程序的其余部分运行,但我一直坚持,直到最慢的一个完成。虽然pthreads已经将时间从大约一分钟减少到大约30秒,但是我可以在大约3秒内从前10次运行中获得更多时间。
感谢您的帮助,这是我的代码:
$count = 0;
foreach ( $array as $i ) {
$imgName = $this->smsId."_$count.jpg";
$name = "LocalCDN/".$imgName;
$stack[] = new AsyncImageModify($i['largePic'], $name);
$count++;
}
// Run the threads
foreach ( $stack as $t ) {
$t->start();
}
// Check if the threads have finished; push the coordinates into an array
foreach ( $stack as $t ) {
if($t->join()){
array_push($this->imgArray, $t->data);
}
}
class class AsyncImageModify extends \Thread{
public $data;
public function __construct($arg, $name, $container) {
$this->arg = $arg;
$this->name = $name;
}
public function run() {
//tried putting the set_time_limit() here, didn't work
if ($this->arg) {
// Get the image
$didWeGetTheImage = Image::getImage($this->arg, $this->name);
if($didWeGetTheImage){
$timestamp1 = microtime(true);
print_r("Starting face detection $this->arg" . "\n");
print_r(" ");
$j = Image::process1($this->name);
if($j){
// lets go ahead and do our image manipulation at this point
$userPic = Image::process2($this->name, $this->name, 200, 200, false, $this->name, $j);
if($userPic){
$this->data = $userPic;
print_r("Back from process2; the image returned is $userPic");
}
}
$endTime = microtime(true);
$td = $endTime-$timestamp1;
print_r("Finished face detection $this->arg in $td seconds" . "\n");
print_r($j);
}
}
}
答案 0 :(得分:1)
很难猜出Image :: *方法的功能,所以我无法回答任何细节。
我能说的是,我能想到的机器非常少,适合在任何情况下运行20个并发线程。更合适的设置是工人/可堆叠模型。 Worker线程是一个可重用的上下文,可以在任务之后执行任务,实现为Stackables;在多线程环境中执行应始终使用最少量的线程来完成最多的工作。
Please see pooling example和其他examples与pthreads一起分发,可在github上获得,此外,如果您在此之后仍在努力,过去的错误报告中会包含大量有关使用情况的信息。 ..