【问题标题】:How to run external command in parallel using AnyEvent and Perl如何使用 AnyEvent 和 Perl 并行运行外部命令
【发布时间】:2016-08-18 05:04:31
【问题描述】:

我是 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";

【问题讨论】:

    标签: perl asynchronous anyevent io-async


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢 Marc,修复了模块名称。我已经接受了你的回答,但是我确实有一个问题......当我删除循环内的开始/结束时,它不会在发生错误时因“命令失败”而死。是什么原因造成的?
    • 抱歉来晚了。如果您删除循环内的开始/结束,则以下 recv 调用将立即返回(无需等待)并且您的程序将退出。这会导致您的程序没有机会报告任何内容 - 命令(可能)已运行,但您的程序甚至在检测到错误之前就退出了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2011-08-15
    • 2014-07-31
    • 2021-08-27
    • 2022-11-02
    • 1970-01-01
    相关资源
    最近更新 更多