php pthreads 多线程扩展的使用:一个较为稳定例子。

今天研究了worker stackable的配合方法,写了两种形式,虽然能工作,但是都会出现内存不听增长的问题;

于是把第一个方法的代码邮件给了作者,到现在他没有回复我。

我最后放弃两者配合的方式,直接使用worker,发现到现在执行了582000个工作,内存没有增长,速度也基本稳定,代码如下:

<?php
ini_set('zend.enable_gc', true);

class ExampleWorker extends Worker {
	public $stack_count = 0;
	public function __construct() {}
	public function run(){
		sleep(1);//waiting for data
		$count = 0;
		$data_flag = true;
		$stime = microtime(true);
		while(1){
			if($data = $this->shift()){
				$data_flag = true;
				$this->doSomeWork();
				if((++$count)%1000==0){
					printf("Work Mermory used %.3fMB RAM, time: %3f===> %d 
",  
					memory_get_peak_usage(true)/1048576, (microtime(true) - $stime), $count);
					$stime = microtime(true);
				}
			}else{
				usleep(100000);
			}
		}		
		exit;
	}
	private function doSomeWork(){
		$str = 'sdalsadkfkasd;lfksa;ldfkas;lkf;lsadkf;as';
		$len = strlen($str);
		
		$s = substr($str,rand(0,$len));
		$len = floor(strlen($s)/2);
		
		for($i=0;$i<$len;$i++){
			$tmp = $s[$i];
			$idx = intval($len-$i-1);

			$s[$i] = $s[$idx];
			$s[$idx] = $tmp;
		}
	}
}

$worker= new ExampleWorker(sprintf("Worker [%d]", 0));
$worker->start();

$stime = microtime(true);
$count = 3000000;//99999999;
$total = $count*5;

$ct = 0;
while($count--){
	//for ($target = 0; $target < 5; $target++)
	$worker[]='data_'.(++$ct);
	usleep(rand(200,1800));
}
//sleep(10);
$runtime = (microtime(true)-$stime);
printf("---------------------------------------------------------
");
printf("Used time is %f 
", $runtime);
printf("Mermory used %.3fMB RAM, added %d, left %d
", memory_get_peak_usage(true)/1048576, $total, count($worker));
printf("---------------------------------------------------------
");

//var_dump($works);


 

虚拟上的运行速度:

Work Mermory used 0.250MB RAM, time: 2.141709===> 607000 
Work Mermory used 0.250MB RAM, time: 1.721918===> 608000 
Work Mermory used 0.250MB RAM, time: 1.858363===> 609000 
Work Mermory used 0.250MB RAM, time: 1.734542===> 610000 
Work Mermory used 0.250MB RAM, time: 1.819794===> 611000 
Work Mermory used 0.250MB RAM, time: 1.847132===> 612000 
Work Mermory used 0.250MB RAM, time: 1.740353===> 613000 
Work Mermory used 0.250MB RAM, time: 1.628364===> 614000 
Work Mermory used 0.250MB RAM, time: 1.731518===> 615000 
Work Mermory used 0.250MB RAM, time: 1.730583===> 616000 
Work Mermory used 0.250MB RAM, time: 1.825315===> 617000 
Work Mermory used 0.250MB RAM, time: 1.762334===> 618000 
Work Mermory used 0.250MB RAM, time: 1.842860===> 619000 
Work Mermory used 0.250MB RAM, time: 1.732677===> 620000 


 

原文地址:https://www.cnblogs.com/lein317/p/5067585.html