zoukankan      html  css  js  c++  java
  • 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 
    


     

  • 相关阅读:
    项目开发问题笔记
    HDU 1800——Flying to the Mars——————【字符串哈希】
    FZU 2122 ——又见LKity——————【KMP字符串匹配】
    FZU 2122——又见LKity——————【字符串匹配、暴力】
    POJ 3468——A Simple Problem with Integers——————【线段树区间更新, 区间查询】
    HRBUST 1909——理工门外的树——————【离线处理,差分前缀和】
    HRBUST 1161——Leyni——————【线段树单点更新,区间查询】
    用Gvim建立IDE编程环境 (Windows篇)
    FZU 2207 ——以撒的结合——————【LCA + 记录祖先】
    HDU 5635 ——LCP Array ——————【想法题】
  • 原文地址:https://www.cnblogs.com/lein317/p/5067585.html
Copyright © 2011-2022 走看看