Добрый день!
Есть код, который опрашивает железо через интервалы времени и складывает собранные данные в бд.
Код legacy, автор не я.
Есть вопрос касающийся вычисления задержки между опросами (delay)
Общий смысл такой (названия переменных сохранены, вместо работы sleep-ы):
#/usr/bin/env perl
use strict;
use warnings;
my $freq = 10;
my $EPOH = time;
data_processing(4,$freq, $EPOH-$freq);
sub data_processing{
my ($delay, $freq, $ts_start) = @_;
# *** начать сбор данных необходимо через delay секунд
sleep $delay;
# *** здесь происходит сбор данных
sleep 1;
my $ts_cur = time;
# *** здесь происходит сохранение данных
sleep 1;
# !!! алгоритм рассчета delay
my $next_ts_start = $ts_start + $freq;
$delay = $freq - ($ts_cur - $next_ts_start);
$delay = 1 if $delay < 1;
print "freq=[$freq] ts_start=[$ts_start] ts_cur=[$ts_cur] next_ts_start=[$next_ts_start] delay=[$delay]\n";
data_processing($delay, $freq, $next_ts_start);
}
freq=[10] ts_start=[1395319276] ts_cur=[1395319291] next_ts_start=[1395319286] delay=[5] freq=[10] ts_start=[1395319286] ts_cur=[1395319298] next_ts_start=[1395319296] delay=[8] freq=[10] ts_start=[1395319296] ts_cur=[1395319308] next_ts_start=[1395319306] delay=[8] freq=[10] ts_start=[1395319306] ts_cur=[1395319318] next_ts_start=[1395319316] delay=[8]
Реальный код использует неблокирующий Net::SNMP и ему сообшает вычисленый delay.
Здесь получается, что next_ts_start всегда оказывается в прошлом и это сильно путает.
Но как это работает мне понятно.
Вопрос:
Я не понимаю, зачем так сделано?
Есть-ли какие-то причины чтобы рассчитывать этот dealy именно так, а не просто вычесть целевое время из текущего?