Класс Worker

(PECL pthreads >= 2.0.0)

Введение

Рабочие потоки имеют постоянный контекст, поэтому в большинстве случаев их следует использовать поверх потоков.

Когда Worker запущен, будет выполнен метод run, но Thread не завершится, пока не будет выполнено одно из следующих условий:

  • Worker исчезнет из области видимости (не останется ни одной ссылки на него)

  • программист вызовет функцию остановки

  • скрипт завершит работу

Это значит, что программист может переиспользовать контекст во время исполнения. Размещение объекта на стек объекта Worker приведёт к запуску метода run этого объекта.

Обзор классов

Worker extends Thread implements Traversable , Countable , ArrayAccess {
/* Методы */
public collect(Callable $collector = ?): int
public getStacked(): int
public isShutdown(): bool
public isWorking(): bool
public shutdown(): bool
public stack(Threaded &$work): int
public unstack(): int
/* Наследуемые методы */
public Thread::detach(): void
public Thread::getCreatorId(): int
public static Thread::getCurrentThreadId(): int
public Thread::getThreadId(): int
public static Thread::globally(): mixed
public Thread::isJoined(): bool
public Thread::isStarted(): bool
public Thread::join(): bool
public Thread::kill(): void
public Thread::start(int $options = ?): bool
}

Содержание

add a note add a note

User Contributed Notes 1 note

up
-6
event2game at gmail dot com
7 years ago
There's one way to shared datas between Workers, that is using Stackable:
<?php
class data extends Stackable{
   
//private $name;
   
public function __construct($_name) {
       
//$this->name = $_name;//if you set any variable, workers will get the variable, so do not set any variable
       
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());//writting datas
           
usleep(rand(50000, 1000000));
        }
    }

}
$data = new data('');
$reader = new readWorker($data);
$writer = new writeWorker($data);
$reader->start();
$writer->start();
?>
Also you can use $readWorker[] = $some_data; then use $this->shift() in readWorker to share datas with readWorker, but if you do so you can't have variables in readWorker as all variales will be shift by shift();
To Top