perl 中的调度子程序
Posted
技术标签:
【中文标题】perl 中的调度子程序【英文标题】:Schedule subroutines in perl 【发布时间】:2016-04-06 08:49:41 【问题描述】:我正在解析一个日志文件,我需要为每 1 秒、5、5 分钟、15、30、1 小时等生成带有结果的 JSON 文件
我对这里的概念感到困惑,可以编写一个大的无限 while 循环,其中包括多个子例程,每个子例程将根据不同的时间间隔执行其解析。
这是我到目前为止,不确定这是否是正确的方法
#!/usr/bin/perl
use strict;
use warnings;
$ | = 1; # Ensure output appears
my $interval = 1;
my @command = "echo processing ...";
my $count = 0;
while (1)
`since access.log | json_convert.pl
sleep $interval - time % $interval;
system @command;
【问题讨论】:
这应该是 Perl 代码吗?它充满了语法错误。从您的问题中也不清楚问题是什么。您应该edit您的问题并包括示例输入和输出数据。 我对你的问题感到困惑。我什至想知道您是否了解自己的任务。 我想在一个脚本中以不同的时间间隔运行不同的任务,而不依赖于诸如 "at, cron ..etc" 之类的 linux 任务调度程序,因此我为每个必需的任务创建了多个子例程,但是我对如何及时执行这些任务感到困惑,@Borodin 解决方案对我有用:) 【参考方案1】:重复的sleep
调用会迅速漂移,因为它们没有考虑创建 JSON 数据所花费的时间。我也会非常谨慎地使用system
调用来进行数据操作,因为它必然会减慢速度,并且您可能会超出您正在寻找的一秒响应时间。全部在 Perl 中完成
我建议你看看优秀的EV
模块。 periodic 事件类型是您所需要的
这是一个非常简短的示例。您自己的回调子例程应该检查调用它的时间以确定要做什么,根据它是否是 5 秒、60 秒等的倍数。或者,您可以设置多个事件循环,每个间隔一个。该模块使其非常简单
use strict;
use warnings 'all';
use feature 'say';
use EV;
use Time::Piece 'localtime';
STDOUT->autoflush;
my $one_second = EV::periodic 1, 1, 0, \&callback;
sub callback
say "Periodic event at ", localtime(EV::now)->hms;
;
EV::run;
输出
Periodic event at 10:27:36
Periodic event at 10:27:37
Periodic event at 10:27:38
Periodic event at 10:27:39
Periodic event at 10:27:40
等等
【讨论】:
以上是关于perl 中的调度子程序的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 Perl-CGI 应用程序中的所有错误(例如,使用 Perl 编译器或类似 lint 的工具检查,免费开源?)