(PECL pthreads >= 2.0.0)
Введение
Потоки Worker имеют постоянный контекст, поэтому в большинстве случаев их следует использовать поверх классов Threads.
Когда Worker запускается, метод Run будет выполнен, но поток не оставится, пока не будет выполнено одно из следующих условий:
-
Worker выходит за пределы области действия (больше не остается ссылок)
-
программист вызывает завершение работы
-
скрипт завершается
Это означает, что программист может повторно использовать контекст во время выполнения; размещение объектов в стеке Worker приведет к тому, что Worker будет выполнять метод выполнения с накоплением объектов.
Обзор классов
class Worker extends Thread implements Traversable , Countable , ArrayAccess {
/* Методы */
public int collect ([ Callable $collector ] )
public int getStacked ( void )
public bool isShutdown ( void )
public bool isWorking ( void )
public bool shutdown ( void )
public int stack ( Threaded &$work )
public int unstack ( void )
/* Наследуемые методы */
public void Thread::detach ( void )
public int Thread::getCreatorId ( void )
public static Thread Thread::getCurrentThread ( void )
public static int Thread::getCurrentThreadId ( void )
public int Thread::getThreadId ( void )
public static mixed Thread::globally ( void )
public bool Thread::isJoined ( void )
public bool Thread::isStarted ( void )
public bool Thread::join ( void )
public void Thread::kill ( void )
public bool Thread::start ([ int $options ] )
}
Существует один способ совместного использования данных между Workers, то есть с помощью Stackable:
<?php
class data extends Stackable{
//private $name;
public function __construct($_name) {
//$this->name = $_name;//если вы установите любую переменную, работники получат переменную, поэтому не устанавливайте никакой переменной
echo __FILE__.'-'.__LINE__.'<br/>'.chr(10);
}
public function run(){
echo __FILE__.'-'.__LINE__.'<br/>'.chr(10);
}
}
class readWorker extends Worker {
public function __construct(&$_data) {
$this->data = $_data;//
}
public function run(){
while(1){
if($arr=$this->data->shift())//receiving datas
{
echo 'Received data:'.print_r($arr,1).chr(10);
}else usleep(50000);
}
}
}
class writeWorker extends Worker {
public function __construct(&$_data) {
$this->data = $_data;//
}
public function run(){
while(1){
$this->data[] = array(time(),rand());//запись данных
usleep(rand(50000, 1000000));
}
}
}
$data = new data('');
$reader = new readWorker($data);
$writer = new writeWorker($data);
$reader->start();
$writer->start();
?>
Также вы можете использовать $readWorker[] = $some_data; затем используйте $this->shift() в readWorker, чтобы поделиться данными с readWorker, но если вы это сделаете, у вас не будет переменных в readWorker, так как все переменные будут сдвинуты на shift();