php pthreads 多線程擴展的使用:一個較爲穩定例子。

今天研究了worker stackable的配合方法,寫了兩種形式,雖然能工做,可是都會出現內存不聽增加的問題; php

因而把第一個方法的代碼郵件給了做者,到如今他沒有回覆我。 this

 

我最後放棄二者配合的方式,直接使用worker,發現到如今執行了582000個工做,內存沒有增加,速度也基本穩定,代碼以下: spa

  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);  


 

虛擬上的運行速度: .net

  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  
相關文章
相關標籤/搜索