(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();