承诺没有并行运行

时间:2018-04-19 14:01:35

标签: perl promise

我正在尝试使用 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
          ]
        ];

这有什么问题?

2 个答案:

答案 0 :(得分:3)

Promise是一种构建回调的机制,而不是在 parallel 中运行代码的方法。回调和并行之间存在一些联系,因为它们都可以用于异步编程,如果我们必须等待某些东西,我们会运行另一段代码。如果没有线程,则需要使用一些事件循环,并在等待时告诉事件循环。

来自Mojolicious Web框架的Common Perl事件循环是IO::AsyncMojo::IOLoop

Perl并没有真正做多线程 - 线程实际上是fork()仿真(参见threads warning),而且最终不是你从Java中知道的那种线程。

答案 1 :(得分:-1)

您似乎已从Promises获取了概要代码,并删除了事件循环模块AnyEvent::HTTP以及对其的所有调用。这就是为什么你的程序没有按预期工作的原因

Promises无法自行提供并行性:它需要一个事件循环来创建可以运行的多个进程" in parallel",但CPAN上的任何事件循环模块都可以正常运行

您想要使用并行性是什么?事件循环模块的正确选择将使所有差异

但请不要忘记,除非您的程序活动受磁盘限制或网络限制,否则您不太可能看到性能方面的重大改进。多处理是一种错觉,操作系统会在进程间分配处理器时间,但只有一个处理器,经过的时间总是比隔离运行的等效进程更多