我在使用 hypnotoad 的子程序很长时遇到了一些麻烦。我需要运行 1 分钟的子程序(硬件连接要求)。
首先,我发现这种行为:
my $var = 0;
Mojo::IOLoop->recurring(60 => sub {
$log->debug("starting loop: var: $var");
if ($var == 0) {
#...
#make some long (30 to 50 seconds) communication with external hardware
sleep 50; #fake reproduction of this long communication
$var = 1;
}
$log->debug("ending loop: var: $var");
})
日志:
14:13:45 2018 [debug] starting loop: var: 0
14:14:26 2018 [debug] ending loop: var: 1 #duration: 41 seconds
14:14:26 2018 [debug] starting loop: var: 0
14:15:08 2018 [debug] ending loop: var: 1 #duration: 42 seconds
14:15:08 2018 [debug] starting loop: var: 0
14:15:49 2018 [debug] ending loop: var: 1 #duration: 42 seconds
14:15:50 2018 [debug] starting loop: var: 0
14:16:31 2018 [debug] ending loop: var: 1 #duration: 41 seconds
...
3 个问题:
1)这 42 秒是从哪里来的?(是的,我知道,42 秒是宇宙的答案……)
2) 为什么 IOLoop 复发会失去节奏?
3) 为什么我的变量设置为 1,而仅仅一秒钟后,if 得到一个等于 0 的变量?
当循环作业需要 20 秒或 25 秒时,没问题。
当循环作业需要 60 秒并与 morbo 一起使用时,没问题。
当循环作业需要超过 40 秒并与 hypnotoad(1 个工作人员)一起使用时,这是此处解释的行为。
如果我增加“不需要”的时间(例如 60 秒作业的 120 秒 IOLoop,行为总是相同的。
IOLoop 不是问题,我可以在循环外重现相同的行为。
我怀疑工人被杀和心跳有问题,但我没有这方面的日志。