簡體   English   中英

承諾不並行運行

[英]Promises in not running in parallel

我正在嘗試使用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
          ]
        ];

這有什么問題?

Promise 是一種構造回調的機制,而不是一種並行運行代碼的方法。 回調和並行之間有一些聯系,因為兩者都可以用於異步編程,如果我們必須等待某些東西,我們會運行另一段代碼。 沒有線程,需要你使用一些事件循環,並在等待時告訴事件循環。

常見的 Perl 事件循環是來自 Mojolicious Web 框架的IO::AsyncMojo::IOLoop

Perl 並沒有真正做多線程——線程實際上是一個fork()仿真(參見threads警告),而且絕對不是你從 Java 中知道的那種線程。

看起來您已經從Promises中獲取了概要代碼,並刪除了事件循環模塊AnyEvent::HTTP以及對它的所有調用。 這就是為什么您的程序無法按預期運行的原因

Promises本身不能提供並行性:它需要一個事件循環來創建可以“並行”運行的多個進程,但是 CPAN 上的任何事件循環模塊都可以

您想將並行性用於什么目的? 事件循環模塊的正確選擇將使一切變得不同

但是不要忘記,除非您的程序的活動是受磁盤限制或受網絡限制的,否則您不太可能看到性能的重大改進。 多處理是一種錯覺,操作系統將在進程之間分配處理器時間,但只有一個處理器,經過的時間總是比單獨運行的等效進程多

如果您想要一種允許並行執行的替代方法,使用基於 fork 的 Promise,還有Promise::Me 有了這個,您可以輕松地執行以下操作:

my $p = Promise::Me->new(sub
{
    # Some code to execute
})->then(sub
{
    my( $resolve, $reject ) = @$_;
    my $res = shift( @_ ); # return value from the code executed above
    # more processing...
    # You can use $resolve->( $some_data ); to resolve or $reject->( $some_exception ); to reject.
})->then(sub
{
    my $more = shift( @_ ); # return value from the previous then
    # more processing...
})->catch(sub
{
    my $exception = shift( @_ ); # error that occured is caught here
})->finally(sub
{
    # final processing
})->then(sub
{
    # A last then may be added after finally
};

每個promise都將異步執行,並且獨立於其他promise。

作為全面披露,我是Promise::Me的作者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM