Worker 类

(PECL pthreads >= 2.0.0)

简介

工作线程具有持久的上下文,因此在大多数情况下应优先使用它们而不是线程。

当启动工作线程时,将执行 run 方法,但线程不会退出,直到满足以下条件之一:

  • 工作线程超出范围(不再有引用)。

  • 程序员调用 shutdown 方法。

  • 脚本终止。

这意味着程序员可以在整个执行过程中重用上下文;将对象放在工作线程的堆栈上会导致工作线程执行堆栈对象的 run 方法。

类概要

class Worker extends Thread implements Traversable, Countable, ArrayAccess {
/* 方法 */
public collect(Callable $collector = ?): int
public getStacked(): int
public isShutdown(): bool
public shutdown(): bool
public stack(Threaded &$work): int
public unstack(): int
/* 继承的方法 */
public Thread::join(): bool
public Thread::start(int $options = ?): bool
}

目录

添加注释

用户贡献的注释 1 个注释

event2game at gmail dot com
10 年前
有一种方法可以在工作线程之间共享数据,那就是使用 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())//接收数据
{
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; 然后在 readWorker 中使用 $this->shift() 来与 readWorker 共享数据,但如果你这样做,你不能在 readWorker 中有变量,因为所有变量都将被 shift();
To Top