La clase Worker

(PECL pthreads >= 2.0.0)

Introducción

Los hilos Worker poseen un contexto persistente, por lo que, en la mayoría de los casos, deberían emplearse sobre objetos Threads.

Cuando un Worker se inicia, se ejecutará el método run, pero el Thread no abandonará hasta que se dé una de las siguientes condiciones:

  • el Worker sale del ámbito (ya no quedan más referencias)

  • el programador llama al apagado

  • el script finaliza

Esto significa que el programador puede reutilizar el contexto durante toda la ejecución; la colocación de objetos en la pila del Worker ocasionará que el Worker ejecute los objetos apilados del método run.

Advertencia

El programador debe conservar referencias a los objetos apilados hasta que hayan sido ejecutados o desapilados; la clase Pool proporciona una abstracción de más alto nivel de la funcionalidad del Worker, administrando las referencias para el programador.

Sinopsis de la Clase

Worker extends Thread implements Traversable , Countable , ArrayAccess {
/* Métodos */
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
/* Métodos heredados */
public Thread::detach(): void
public Thread::getCreatorId(): integer
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
}

Tabla de contenidos

add a note add a note

User Contributed Notes 1 note

up
-5
event2game at gmail dot com
10 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