La classe Worker

(PECL pthreads >= 2.0.0)

Introduction

Les Threads Worker ont un contexte persistent, aussi, ils peuvent être utilisés via Threads dans la plupart des cas.

Quand un Worker est démarré, la méthode run() sera exécuté, mais le Thread ne s'arrêtera pas tant qu'une des conditions suivantes n'est pas atteinte :

  • le Worker est hors de portée (aucune référence restante) ;

  • le développeur appelle shutdown() ;

  • le script meurt.

Ce qui signifie que le développeur peut réutiliser le contexte tout au long de l'exécution ; placer des objets sur la pile du Worker va entrainer le Worker à exécuter la méthode run() sur les objets empilés.

Synopsis de la classe

class Worker extends Thread implements Traversable, Countable, ArrayAccess {
/* Méthodes */
public collect(Callable $collector = ?): int
public getStacked(): int
public isShutdown(): bool
public shutdown(): bool
public stack(Threaded &$work): int
public unstack(): int
/* Méthodes héritées */
public Thread::join(): bool
public Thread::start(int $options = ?): bool
}

Sommaire

add a note add a note

User Contributed Notes 1 note

up
-4
event2game at gmail dot com
11 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