文字

Pool::collect

(PECL pthreads >= 2.0.0)

Pool::collect回收已完成任务的引用

说明

public void Pool::collect ( Callable $collector )

对于视为垃圾的引用,使用给定的垃圾收集器进行收集

参数

collector

可调用的垃圾收集器

返回值

void

范例

Example #1 创建 Pool 对象

<?php
class  MyWork  extends  Stackable  {
    public function 
__construct () {
        
$this -> complete  false ;
    }

    public function 
run () {
        
printf (
            
"Hello from %s in Thread #%lu\n"
            
__CLASS__ $this -> worker -> getThreadId ());
        
$this -> complete  true ;
    }

    public function 
isComplete () { 
        return 
$this -> complete
    }

    protected 
$complete ;
}

class 
MyWorker  extends  Worker  {
    
    public function 
__construct ( Something $something ) {
        
$this -> something  $something ;
    }
    
    public function 
run () {
        

    
}
}

$pool  = new  Pool ( 8 , \ MyWorker ::class, [new  Something ()]);
$pool -> submit (new  MyWork ());

usleep ( 1000 );

$pool -> collect (function( $work ){
    return 
$work -> isComplete ();
});
var_dump ( $pool );
?>

以上例程会输出:

Hello from MyWork in Thread #140222468777728
object(Pool)#1 (6) {
  ["size":protected]=>
  int(8)
  ["class":protected]=>
  string(8) "MyWorker"
  ["workers":protected]=>
  array(1) {
    [0]=>
    object(MyWorker)#4 (1) {
      ["something"]=>
      object(Something)#5 (0) {
      }
    }
  }
  ["work":protected]=>
  array(0) {
  }
  ["ctor":protected]=>
  array(1) {
    [0]=>
    object(Something)#2 (0) {
    }
  }
  ["last":protected]=>
  int(1)
}

用户评论:

[#1] your dot brother dot t at hotmail dot com [2014-12-29 09:33:16]

The example code crashes and made me waste 2 working days
First of all, `Stackable` has no attribute named $worker or it's access method made it inaccessible.

Secondly, `Stackable` also doesn't have `getThreadId()` . It's best practice to use `Thread` class for realization of a thread since it has more control functions. It's better to use `Stackable` for object storage and use it's `run()` as its initialization.

The working example is

<?php
    
class MyWork extends Thread {
        protected 
$complete;

        public function 
__construct() {
            
$this->complete false;
        }

        public function 
run() {
            
printf(
                
"Hello from %s in Thread #%lu\n",
                
__CLASS__$this->getThreadId());
            
$this->complete true;
        }

        public function 
isComplete() {
            return 
$this->complete;
        }
    }

    class 
Something {}

    class 
MyWorker extends Worker {

        public function 
__construct(Something $something) {
            
$this->something $something;
        }

        public function 
run() {
            

        
}
    }

    
$pool = new Pool(8, \MyWorker::class, [new Something()]);
    
$pool->submit(new MyWork());

    
usleep(1000);

    
$pool->collect(function($work){
        return 
$work->isComplete();
    });
    
var_dump($pool);
?>

上一篇: 下一篇: