2017-08-28 50 views

回答

9

在回答問題之前:您顯示的代碼丟失start返回的Promise。你可能想要:

await do for @url -> $url { 
    start { 
     say $url; 
     sleep(1); 
    } 
} 

這將等到所有的開始塊已經完成。

回到您的問題:可以在將程序運行到將創建的最大線程數(默認值爲16)之前設置環境變量RAKUDO_MAX_THREADS

也工作在運行時的另一種方法是創建一個動態的新ThreadPoolScheduler對象:

my $*SCHEDULER = ThreadPoolScheduler.new(max_threads => 32); 

任何線程代碼,可以看到這個版本的$*SCHEDULER現在將使用這個調度器有可用的32個線程。

1

如果你在一個數組中有一堆作業,並且想要並行處理它們,請看hyperrace。 (目前標記爲「實驗」,他們將在下一個主要版本中更好地工作。)

有了它們,您可以(可能)使用'batch'和'degree'參數控制並行性。

@url.race(:batch(1),:degree(4)).map(-> $url { 
    say $url; 
    sleep(1); 
}); 

它們當然受ThreadPoolScheduler的整體線程限制。

+0

@firecat小心使用'race'和'hyper'。他們真的很有趣。但是,如果您在生產中使用它們,請務必對您的代碼進行良好的測試。他們有多個錯誤(例如[126597](https://rt.perl.org/Public/Bug/Display.html?id=126597),[129234](https://rt.perl.org/Public /Bug/Display.html?id=129234),[127365](https://rt.perl.org/Public/Bug/Display.html?id=127365)和[130576](https:// rt。 perl.org/Public/Bug/Display.html?id=130576))。 –