我在使用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 recuring失去了节奏?
3)为什么我的变量被设置为1,仅仅一秒后,if得到一个变量等于0?
当循环作业需要20秒或25秒时,没问题 当循环工作需要60个secondes并与morbo一起使用时,没有问题 当循环作业需要超过40秒并与hypnotoad(1 worker)一起使用时,这是此处解释的行为。
如果我增加“不需要”时间(例如120秒IOLoop 60秒作业,行为总是相同。
这不是IOLoop的问题,我可以在循环外重现相同的行为 我怀疑工人死亡和心脏跳动有问题,但我没有记录。