我正在尝试使用
Promises
模块
并行运行一个进程。我的要求不是要求新的流程让它运行。
我尝试了这段代码,但并没有并行执行
use AnyEvent::HTTP;
use JSON::XS qw[ decode_json ];
use Promises qw[ collect deferred ];
use Data::Dumper;
sub process {
my ($data) = @_;
my $d = deferred;
for (1..5) {
print "\n$data " . $_ * $data;
}
$d->resolve($data);
$d->promise;
}
collect(
process(10),
process(20),
process(30),
)->then(
sub {
print Dumper(\@_);
},
);
1;
输出
10 10
10 20
10 30
10 40
10 50
20 20
20 40
20 60
20 80
20 100
30 30
30 60
30 90
30 120
30 150$VAR1 = [
[
10
],
[
20
],
[
30
]
];
这有什么问题?
答案 0 :(得分:3)
Promise是一种构建回调的机制,而不是在 parallel 中运行代码的方法。回调和并行之间存在一些联系,因为它们都可以用于异步编程,如果我们必须等待某些东西,我们会运行另一段代码。如果没有线程,则需要使用一些事件循环,并在等待时告诉事件循环。
来自Mojolicious Web框架的Common Perl事件循环是IO::Async和Mojo::IOLoop。
Perl并没有真正做多线程 - 线程实际上是fork()
仿真(参见threads
warning),而且最终不是你从Java中知道的那种线程。
答案 1 :(得分:-1)
您似乎已从Promises
获取了概要代码,并删除了事件循环模块AnyEvent::HTTP
以及对其的所有调用。这就是为什么你的程序没有按预期工作的原因
Promises
无法自行提供并行性:它需要一个事件循环来创建可以运行的多个进程" in parallel",但CPAN上的任何事件循环模块都可以正常运行
您想要使用并行性是什么?事件循环模块的正确选择将使所有差异
但请不要忘记,除非您的程序活动受磁盘限制或网络限制,否则您不太可能看到性能方面的重大改进。多处理是一种错觉,操作系统会在进程间分配处理器时间,但只有一个处理器,经过的时间总是比隔离运行的等效进程更多