2016-09-21 15 views
2
+可能性

场景:父进程应产卵n个工作儿童加载数据至阶段表,父频繁地(每15分钟)调用存储过程以从载物台移动的日期 - >芯的Perl多发性ALRM信号

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

寻求建议,如果建立Signal处理程序来调用执行时间应该大约为5分钟的存储过程是个好主意,想知道如果另一个ALRM信号关闭时存储过程超过15分钟会发生什么。

这会第二信号得到

  • 排队等待稍后处理
  • 丢失完全
  • 调用另一个处理程序和存储过程的实例,而以前的处理程序仍在运行。

回答

2

你问,如果你有

$SIG{ALRM} = sub { 
    alarm(15*60); 
    call_stored_proc(); 
}; 

alarm(15*60); 

call_stored_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 

正如你所看到的,call_stored_proc不中断。 SIGALRM被抑制,直到SIGALRM处理程序返回。

+0

请注意,如果您想获得不同的结果,您可以确实揭露SIGALRM。 – ikegami

+0

感谢ikegami,精彩的模拟! – Shashi