Pthreads бассейн преждевременно заканчивается, как я могу заставить его работать правильно?

Я недавно перекомпилировал свой сервер, чтобы я мог использовать многопоточность в PHP (используя pThreads). Я уже получил работу с pthreads и использовал их в других сценариях, однако заставить их работать в пуле становится более сложной задачей, чем я думал.

В настоящее время у меня есть это доказательство концепции сценария:

$tArray = array();
class APIWork extends Collectable {
protected $complete;
public $status;
public $file;
public $url;
public function __construct($pFile, $pUrl){
//transfer all the variables to local variables
$this->complete = false;
$this->status = 'never ran';
$this->file = $pFile;
$this->url = $pUrl;
}
public function run(){
$this->status = 'started';
usleep(3000);
$this->status = 'completed';
$this->complete = true;
}
public function isGarbage() {
return $this->complete;
}
}
$pool = new Pool(3);
$counter = 0;
$filename = 'testfile';
$url = 'asdf';
for($i=0;$i<5;$i++) {
$tArray[$counter] = new Threaded();
$pool->submit(new APIWork($filename, $url));
$counter++;
}
$retArr = array();
$pool->collect(function(APIWork $task){
global $retArr;
//$task->join();
$tmpObj = new stdclass();
$tmpObj->filePath = $task->file;
$tmpObj->url = $task->url;
$tmpObj->status = $task->status;
$tmpObj->complete = $task->complete;
array_push($retArr, $tmpObj);
return $task->isGarbage();
});
$pool->shutdown();
echo '<pre>';
print_r($retArr); //return the array of results
echo '</pre>';

То, что я получаю, выглядит примерно так:

Array
(
[0] => stdClass Object
(
[filePath] => testfile
[url] => asdf
[status] => completed
[complete] => 1
)

[1] => stdClass Object
(
[filePath] => testfile
[url] => asdf
[status] => started
[complete] =>
)

[2] => stdClass Object
(
[filePath] => testfile
[url] => asdf
[status] => started
[complete] =>
)

[3] => stdClass Object
(
[filePath] => testfile
[url] => asdf
[status] => started
[complete] =>
)

[4] => stdClass Object
(
[filePath] => testfile
[url] => asdf
[status] => never ran
[complete] =>
)

)

Похоже, что хотя я убедился, чтобы запустить $pool->shutdown(); команда, pthreads не разрешается завершить. Может кто-нибудь, пожалуйста, помогите мне понять, как сделать так, чтобы пул потоков позволял завершать потоки.

Примечание: я использую PHP 5.6.18 с Pthreads 2.0.10 на веб-сервере Ubuntu, если это поможет.

Кроме того, я попытался смоделировать свой код после следующего, так как я считаю, что этот парень — главный авторитет в pThreads, но я добавил и удалил, чтобы передавать данные туда, где мне было нужно:
pThreads Pool пример от krakjoe

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]