CPU を集中的に使用するタスクを実行する場合、コアごとに 1 つのスレッドを使用するのが最適だと思います。4 コアの CPU を使用している場合、CPU を集中的に使用するサブルーチンの 4 つのインスタンスをペナルティなしで実行できます。たとえば、4 コア CPU で CPU 集中型アルゴリズムの 4 つのインスタンスを実験的に実行したことがあります。プロセスあたりの時間は最大 4 倍減少しませんでした。5 回目のインスタンスでは、すべてのインスタンスに時間がかかりました。
操作をブロックする場合はどうなりますか? 1,000 個の URL のリストがあるとします。私は次のことを行ってきました:
(構文エラーは気にしないでください。私はこれをモックアップしました)
my @threads;
foreach my $url (@urlList) {
push @threads, async {
my $response = $ua->get($url);
return $response->content;
}
}
foreach my $thread (@threads) {
my $response = $thread->join;
do_stuff($response);
}
基本的に、URL リストにある URL と同じ数のスレッドを開始しています。100 万の URL がある場合、100 万のスレッドが開始されます。最適なスレッド数ではない場合、これは最適ですか? スレッドを使用することは、待機できるブロッキング I/O 操作 (ファイルの読み取り、データベースクエリなど) に適していますか?
関連ボーナス質問
好奇心から、Perl スレッドは Python と同じように動作し、それは GIL ですか? Python でマルチスレッドの利点を得て、CPU 集中型のタスクにすべてのコアを利用するには、マルチプロセッシングを使用する必要があります。