6

我是 Perl 5 异步进程的新手,发现CPAN提供了类似的支持,我们可以在Node.js中使用 AnyEvent、IO::Async 等提供类似的支持,这令人兴奋。但是,本教程提供了一些复杂内容的示例。我只需要使用 AnyEvent 并行运行外部系统命令。

我在下面的示例中是否正确地异步压缩了多个文件?请不要担心运行系统命令zip而不是使用 CPAN 模块;该示例纯粹是为了演示运行异步进程的想法......

#!/bin/env perl
use strict; 
use AnyEvent;
use AnyEvent::Util;

my $s1    = time;

my $quit_program = AnyEvent->condvar(
    cb => sub {
        warn "Done async";
    }
);

my $result;
$quit_program->begin( sub { shift->send($result) } );

for my $file (@files) {
    $quit_program->begin;

    my $cv; $cv = run_cmd [qw(zip), "${file}.zip", $file],
                "<" , "/dev/null",
                ">" , "/dev/null",
                "2>", "/dev/null";

    $cv->cb (sub {
        shift->recv and die "command failed";

        # undef $cv;
        $quit_program->end;
    });
}

$quit_program->end;   # end loop
my $foo = $quit_program->recv;
say "Total elapsed time: ", time - $s1, " ms";
4

1 回答 1

3

我假设你的意思是AnyEvent::Util而不是AnyEvent::Tool

否则,我还没有尝试过你的程序,但对我来说,它看起来像是一个使用condvarsand的教科书示例run_cmd。它肯定与我自己写的内容很接近(我是 的作者AnyEvent),正确处理棘手的部分(在为空的情况下有一个外部开始/结束@files),进行错误检查等等。

因此,如果您问我,您实际上确实阅读了文档并使用您的知识通过了考试:)

于 2014-04-30T05:12:57.180 回答