Последних версий поддержки Pthreads затворов в качестве членов, что делает код очень простой:
<?php
class Background extends Thread {
public function __construct(callable $call, array $args = []) {
$this->call = $call;
$this->args = $args;
}
public function run() {
call_user_func_array($this->call, $this->args);
}
protected $call;
protected $args;
}
$background = new Background(function($greeting){
printf("%s\n", $greeting);
}, ["Hello World"]);
$background->start();
$background->join();
function named($greeting) {
printf("%s\n", $greeting);
}
$background = new Background("named", ["Goodbye World"]);
$background->start();
$background->join();
?>
Однако, это ужасно, это трудно представьте себе любую функцию, которая так голодна, что для нее требуется нить. .
Вы начали вниз правильный путь с мыслью, что вы должны повторно использовать контекст и создать рабочий поток, Pthreads имеет все это построен в
Более разумный код с помощью встроенного в классах больше похоже:
<?php
class Background extends Threaded {
public function __construct(callable $call, array $args = []) {
$this->call = $call;
$this->args = $args;
}
public function run() {
call_user_func_array($this->call, $this->args);
}
protected $call;
protected $args;
}
$pool = new Pool(4);
$pool->submit(new Background(function($greeting){
printf("%s\n", $greeting);
}, ["Hello World"]));
$pool->shutdown();
?>
Но это все еще не имеет отношения к возвращаемому значению. Я предполагаю, что вы хотите получить результат вызовов, сделанных с помощью Pool
, в этом случае код выглядит так:
<?php
class Background extends Threaded {
public function __construct(callable $call, array $args = []) {
$this->call = $call;
$this->args = $args;
}
public function run() {
$this->synchronized(function(){
$this->result = call_user_func_array
($this->call, $this->args);
$this->notify();
});
}
public function getResult() {
return $this->synchronized(function(){
while (!isset($this->result))
$this->wait();
return $this->result;
});
}
protected $call;
protected $args;
protected $result;
}
$pool = new Pool(4);
$call = new Background(function($greeting){
return sprintf("%s\n", $greeting);
}, ["Hello World"]);
$pool->submit($call);
echo $call->getResult();
$pool->shutdown();
?>
Как вы можете видеть, вызов Background::getResult
приведет в контексте вызова в ожидании пока результат не будет доступен, это может быть или не быть желательным, но является хорошим примером.
Я бы породил новый php-скрипт с exec –
@ Dagon вы можете разместить код? – vlio20
'exec ('php script.php')' –