Perl+;多个ALRM信号的可能性

Perl+;多个ALRM信号的可能性,perl,signals,Perl,Signals,场景:父进程将产生N个工作子进程以将数据加载到stage表,父进程将频繁(每15分钟)调用存储过程以从stage->core移动日期 想法:计划每隔15分钟设置一个'$SIG{ALRM}'处理程序,并调用信号处理程序中的存储过程 如果设置信号处理程序以调用执行时间应为~5分钟的存储过程是一个好主意,请寻求建议,了解当另一个ALRM信号关闭时,如果存储过程运行超过15分钟会发生什么情况 这第二个信号会被接收吗 排队等待稍后处理 完全迷路了 在前一个处理程序仍在运行时调用另一个处理程序和存储过程实

场景:父进程将产生N个工作子进程以将数据加载到stage表,父进程将频繁(每15分钟)调用存储过程以从stage->core移动日期

想法:计划每隔15分钟设置一个'$SIG{ALRM}'处理程序,并调用信号处理程序中的存储过程

如果设置信号处理程序以调用执行时间应为~5分钟的存储过程是一个好主意,请寻求建议,了解当另一个ALRM信号关闭时,如果存储过程运行超过15分钟会发生什么情况

这第二个信号会被接收吗

  • 排队等待稍后处理
  • 完全迷路了
  • 在前一个处理程序仍在运行时调用另一个处理程序和存储过程实例

    • 你在问如果你有

      $SIG{ALRM} = sub {
         alarm(15*60);
         call_stored_proc();
      };
      
      alarm(15*60);
      
      调用存储的\u proc
      所需时间超过15分钟。你为什么不试试呢

      perl -e'
         use feature qw( say );
      
         my $slow = 2;
         my $done = 0;
      
         sub call_stored_proc {
            say sprintf "[%s] %s: %s", time, "call_stored_proc", "enter";
            sleep($slow ? 8 : 2);
            say sprintf "[%s] %s: %s", time, "call_stored_proc", "leave";
            $done = 1 if !$slow;
            --$slow;
         }
      
         $SIG{ALRM} = sub {
            say sprintf "[%s] %s: %s", time, "SIGALRM hander", "enter";
            say sprintf "[%s] %s: %s", time, "SIGALRM hander", "alarm set for ".(time+5);
            alarm(5);
            call_stored_proc();
            say sprintf "[%s] %s: %s", time, "SIGALRM hander", "leave";
         };
      
         say sprintf "[%s] %s: %s", time, "[root]", "alarm set for ".(time+5);
         alarm(5);
         sleep(1) while !$done;
      '
      
      输出:

      [1474490009] [root]: alarm set for 1474490014
      [1474490014] SIGALRM hander: enter
      [1474490014] SIGALRM hander: alarm set for 1474490019
      [1474490014] call_stored_proc: enter
      [1474490022] call_stored_proc: leave
      [1474490022] SIGALRM hander: leave
      [1474490022] SIGALRM hander: enter
      [1474490022] SIGALRM hander: alarm set for 1474490027
      [1474490022] call_stored_proc: enter
      [1474490030] call_stored_proc: leave
      [1474490030] SIGALRM hander: leave
      [1474490031] SIGALRM hander: enter
      [1474490031] SIGALRM hander: alarm set for 1474490036
      [1474490031] call_stored_proc: enter
      [1474490033] call_stored_proc: leave
      [1474490033] SIGALRM hander: leave
      

      如您所见,
      调用存储的过程
      不会中断。SIGALRM将被抑制,直到SIGALRM处理程序返回。

      请注意,如果希望得到不同的结果,您当然可以取消SIGALRM的掩码。