3

我在使用 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 不是问题,我可以在循环外重现相同的行为。
我怀疑工人被杀和心跳有问题,但我没有这方面的日志。

4

0 回答 0