這是一個glib標題,但是在玩Promises時,我想看看我可以在多大程度上延伸這個想法。在這個程序中,我是這樣做的,所以我可以指定我想要做出多少承諾。Perl 6可以承諾多少個承諾?
- 在線程調度器的默認值是16個線程(rakudo/ThreadPoolScheduler.pm)
- 如果我指定的比數,程序掛起更多,但我沒有得到一個警告(比如,像「太多線程」 )。
- 如果我設置RAKUDO_MAX_THREADS,我可以停止程序掛起,但最終會有太多的線程競爭運行。
我有兩個問題,真的。
程序如何知道它可以創建多少個線程?這比承諾的數量略多,這是值得的。
我怎麼知道我應該允許多少線程,即使我可以做更多?
這是我的弱小的Macbook Air Rakudo 2017.01 4個核心:
my $threads = @*ARGS[0] // %*ENV<RAKUDO_MAX_THREADS> // 1;
put "There are $threads threads";
my $channel = Channel.new;
# start some promises
my @promises;
for 1 .. $threads {
@promises.push: start {
react {
whenever $channel -> $i {
say "Thread {$*THREAD.id} got $i";
}
}
}
}
put "Done making threads";
for ^100 { $channel.send($_) }
put "Done sending";
$channel.close;
await |@promises;
put "Done!";
其中一些可能隨下一版本的Perl 6.d:https:// github而改變。com/rakudo/rakudo/pull/1004 –
這不是關於承諾,而是關於線程... –
作爲一個消費者,只要我嘗試做的事情真正起作用,我不在乎它是否是線程。如果承諾以其他方式實施,我會有同樣的問題。 –