【问题标题】:Schedule subroutines in perlperl 中的调度子程序
【发布时间】: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 解决方案对我有用:)

标签: perl


【解决方案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

等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2021-11-05
    • 2015-06-25
    • 2015-12-12
    • 2013-12-27
    • 1970-01-01
    • 2019-06-29
    相关资源
    最近更新 更多