如何将 IO::Async 与数组一起用作输入?
How can I use IO::Async with an array as input?
我有这个循环:
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 \n";
}
return 0;
},
) );
我怎样才能将数组元素提供给它?
正如@StefanBecker 所评论的,使用 IO::Async is by using an 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 这样的纯进程并行化器可能是您最好的选择,因为它基本上实现了相同的功能(并行分叉和执行),但以更直接的方式进行。 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
,但是第一个使用收敛 Futures 的表达式具有永远不会失败的优点,即使底层调用实际上终止了。
NB2 : IO::Async::Function
和 Future
中有很多选项可以用来处理错误,管理工人的数量和他们的行为,等等。查看文档了解更多详情...
我有这个循环:
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 \n";
}
return 0;
},
) );
我怎样才能将数组元素提供给它?
正如@StefanBecker 所评论的,使用 IO::Async is by using an 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 这样的纯进程并行化器可能是您最好的选择,因为它基本上实现了相同的功能(并行分叉和执行),但以更直接的方式进行。 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
,但是第一个使用收敛 Futures 的表达式具有永远不会失败的优点,即使底层调用实际上终止了。
NB2 : IO::Async::Function
和 Future
中有很多选项可以用来处理错误,管理工人的数量和他们的行为,等等。查看文档了解更多详情...