zoukankan      html  css  js  c++  java
  • php 多进程中的信号问题

    1.以下代码sleep时间远小于20

    <?php 
    // 当子进程退出时,会触发该函数
    function sig_handler($sig) {
    	switch($sig) {
    		case SIGCHLD:
    			echo 'SIGCHLD received'."n";
    	}
    }
      
    pcntl_signal(SIGCHLD, "sig_handler");// 注册子进程退出时调用的函数
    
    $start          = time(); 
    
    $sub_process_cnt = 20;
    for($i=0;$i<$sub_process_cnt;$i++) { 
      
    	sleep(1);   
    	 
    	$pid  = pcntl_fork(); 
    	if ($pid == 0) {
    
    		exit(-1);
    	}
    }
    
    
    $status = 0;
     
    for ($k=0; $k<$sub_process_cnt; $k++) 
    {
    	pcntl_waitpid(-1, $status );
    }
    
    
    $end            = time();
    $usage          = $end - $start;
    print "End, use: ".$usage." seconds" ;
        
    ?>

    2.原因:sleep过程中被子进程返回的信号中断。

    3.解决办法:

    pcntl_signal(SIGCHLD, SIG_IGN ); //忽略子进程返回信号

    全部代码如下

    <?php 
    // 当子进程退出时,会触发该函数
    function sig_handler($sig) {
    	switch($sig) {
    		case SIGCHLD:
    			echo 'SIGCHLD received'."n";
    	}
    }
      
    pcntl_signal(SIGCHLD, SIG_IGN );// 注册子进程退出时调用的函数
    
    $start          = time(); 
    
    $sub_process_cnt = 20;
    for($i=0;$i<$sub_process_cnt;$i++) { 
      
    	sleep(1);   
    	 
    	$pid  = pcntl_fork(); 
    	if ($pid == 0) {
    
    		exit(-1);
    	}
    }
    
    
    $status = 0;
     
    for ($k=0; $k<$sub_process_cnt; $k++) 
    {
    	pcntl_waitpid(-1, $status );
    }
    
    
    $end            = time();
    $usage          = $end - $start;
    print "End, use: ".$usage." seconds" ;
        
    ?>


  • 相关阅读:
    申请加分项
    课程评价
    本周总结
    热词2
    热词1
    php大作业
    css网格布局
    php实验4
    本周总结
    css边框图像
  • 原文地址:https://www.cnblogs.com/riskyer/p/3283249.html
Copyright © 2011-2022 走看看