Mojolicious: длинные подпрограммы не влияют на мою переменную
У меня есть некоторые проблемы с очень длинной подпрограммой с гипнозом. Мне нужно запустить 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 работник), это поведение объясняется здесь.
Если я увеличу время "не нужно" (например, 120 секунд IOLoop для 60 секунд работы, поведение всегда будет таким же.
Это не проблема с IOLoop, я могу воспроизвести такое же поведение вне цикла.
Я подозреваю, что проблема с работником убита и сердцебиение, но у меня нет журнала об этом.