码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-08-10 18:14:41      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

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

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

 

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

  1. <?php  
  2. ini_set(‘zend.enable_gc‘, true);  
  3.   
  4. class ExampleWorker extends Worker {  
  5.     public $stack_count = 0;  
  6.     public function __construct() {}  
  7.     public function run(){  
  8.         sleep(1);//waiting for data  
  9.         $count = 0;  
  10.         $data_flag = true;  
  11.         $stime = microtime(true);  
  12.         while(1){  
  13.             if($data = $this->shift()){  
  14.                 $data_flag = true;  
  15.                 $this->doSomeWork();  
  16.                 if((++$count)%1000==0){  
  17.                     printf("Work Mermory used %.3fMB RAM, time: %3f===> %d \n",    
  18.                     memory_get_peak_usage(true)/1048576, (microtime(true) - $stime), $count);  
  19.                     $stime = microtime(true);  
  20.                 }  
  21.             }else{  
  22.                 usleep(100000);  
  23.             }  
  24.         }         
  25.         exit;  
  26.     }  
  27.     private function doSomeWork(){  
  28.         $str = ‘sdalsadkfkasd;lfksa;ldfkas;lkf;lsadkf;as‘;  
  29.         $len = strlen($str);  
  30.           
  31.         $s = substr($str,rand(0,$len));  
  32.         $len = floor(strlen($s)/2);  
  33.           
  34.         for($i=0;$i<$len;$i++){  
  35.             $tmp = $s[$i];  
  36.             $idx = intval($len-$i-1);  
  37.   
  38.             $s[$i] = $s[$idx];  
  39.             $s[$idx] = $tmp;  
  40.         }  
  41.     }  
  42. }  
  43.   
  44. $workernew ExampleWorker(sprintf("Worker [%d]", 0));  
  45. $worker->start();  
  46.   
  47. $stime = microtime(true);  
  48. $count = 3000000;//99999999;  
  49. $total = $count*5;  
  50.   
  51. $ct = 0;  
  52. while($count--){  
  53.     //for ($target = 0; $target < 5; $target++)  
  54.     $worker[]=‘data_‘.(++$ct);  
  55.     usleep(rand(200,1800));  
  56. }  
  57. //sleep(10);  
  58. $runtime = (microtime(true)-$stime);  
  59. printf("---------------------------------------------------------\n");  
  60. printf("Used time is %f \n"$runtime);  
  61. printf("Mermory used %.3fMB RAM, added %d, left %d\n", memory_get_peak_usage(true)/1048576, $totalcount($worker));  
  62. printf("---------------------------------------------------------\n");  
  63.   
  64. //var_dump($works);  


 

虚拟上的运行速度:

  1. Work Mermory used 0.250MB RAM, time: 2.141709===> 607000   
  2. Work Mermory used 0.250MB RAM, time: 1.721918===> 608000   
  3. Work Mermory used 0.250MB RAM, time: 1.858363===> 609000   
  4. Work Mermory used 0.250MB RAM, time: 1.734542===> 610000   
  5. Work Mermory used 0.250MB RAM, time: 1.819794===> 611000   
  6. Work Mermory used 0.250MB RAM, time: 1.847132===> 612000   
  7. Work Mermory used 0.250MB RAM, time: 1.740353===> 613000   
  8. Work Mermory used 0.250MB RAM, time: 1.628364===> 614000   
  9. Work Mermory used 0.250MB RAM, time: 1.731518===> 615000   
  10. Work Mermory used 0.250MB RAM, time: 1.730583===> 616000   
  11. Work Mermory used 0.250MB RAM, time: 1.825315===> 617000   
  12. Work Mermory used 0.250MB RAM, time: 1.762334===> 618000   
  13. Work Mermory used 0.250MB RAM, time: 1.842860===> 619000   
  14. Work Mermory used 0.250MB RAM, time: 1.732677===> 620000  

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

标签:

原文地址:http://my.oschina.net/u/588516/blog/490268

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!