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" ;
        
    ?>


  • 相关阅读:
    iSeries存储过程笔记
    最近做得的网站
    两个iSeries存储过程的示例
    索引的怪异问题
    Saas的概念感触
    asp.net 2.0的TextBox遭遇ReadOnly=True时ViewState不回传的问题
    网上看到的一句诗
    DB2/400到Oracle的迁移
    如何往自己的网站增加Asp.net Ajax
    default关键字作用
  • 原文地址:https://www.cnblogs.com/riskyer/p/3283249.html
Copyright © 2011-2022 走看看