perl - 如何使用 IO::Async 并以数组作为输入?

标签 perl io-async

我有这个循环:

foreach my $element ( @array ) {
     my $result = doSomething($element);
}

由于数组按顺序处理并不重要,并且脚本运行时间较长,因此我想异步运行 doSomething()

我正在看IO::Async为此,但我似乎找不到循环的输入是如上所述的简单数组的示例。该示例似乎重点关注开放套接字、STDIN 等。

下面是给出的示例,显示通过 STDIN 将数据馈送到循环:

$loop->add( IO::Async::Stream->new_for_stdin(
   on_read => sub {
      my ( $self, $buffref, $eof ) = @_;

      while( $$buffref =~ s/^(.*)\n// ) {
          print "You typed a line $1\n";
      }

      return 0;
   },
) );

如何向其提供数组元素?

最佳答案

正如 @StefanBecker 所评论的,处理这个问题的最简单方法是 IO::Async是通过使用 IO::Async::Function .

来自文档:

This subclass of IO::Async::Notifier wraps a function body in a collection of worker processes, to allow it to execute independently of the main process.

IO::Async框架,IO::Async::Function 的典型用例是当一个阻塞进程需要异步执行时。

免责声明:请注意,@zdim 也评论过,IO::Async可能不是最适合您的用例。纯进程并行器,例如 Parallel::ForkManager在这里可能是您的最佳选择,因为它基本上实现了相同的功能(并行 fork 和执行),但以更直接的方式。 IO::Async 的主要差异化因素之一附带其 I/O 多路复用功能,您在这里似乎没有使用它。

但是既然你要求 IO::Async ,这是此类实现的一个示例:我转doSomething进入一个虚拟方法,该方法只等待作为参数给出的时间。这可以让您观察异步执行的效果。

use strict;
use warnings;

use IO::Async::Function;
use IO::Async::Loop;
use Future;

# dummy sub
sub doSomething { 
    my ( $delay ) = @_;
    print "start waiting $delay second(s)\n";
    sleep $delay;
    print "done sleeping $delay second(s)\n"; 
    return $delay;
}

# prepare the function for execution
my $loop = IO::Async::Loop->new;
my $function = IO::Async::Function->new( code => sub { return doSomething($_[0]) } );
$loop->add($function);

# trigger asynchronous processing
my @array = qw/5 2 4 0/;
my @futures = map { $function->call( args => [ $_ ] ) } @array;

# safely wait for all ops to complete
Future->wait_all(@futures)->await;
print "all done !\n";

这会产生:

start waiting 5 second(s)
start waiting 2 second(s)
start waiting 4 second(s)
start waiting 0 second(s)
done sleeping 0 second(s)
done sleeping 2 second(s)
done sleeping 4 second(s)
done sleeping 5 second(s)
all done !

NB1:Future->wait_all(@futures)->await也可以写成$_->get for @futures ,但是第一个使用收敛 Future 的表达式具有永远不会失败的优点,即使底层调用实际上终止了。

NB2:IO::Async::Function 中有许多选项可用。和Future处理错误、管理 worker 数量及其行为等等。查看文档了解更多详细信息...

关于perl - 如何使用 IO::Async 并以数组作为输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53836806/

相关文章:

perl - url语言前缀的催化剂最佳方式?

perl - 如何在 Perl 中执行类似 SQL 的连接?

python 比 perl mySql 查询慢 5 倍

multithreading - Perl ithreads : Do some math instead of sleeping

perl - 使用 Perl,如何跟踪常量被重新定义的位置?

linux - 嗯,IO::Async 甚至无法处理 10k 连接?