如果执行 CPU 密集型任务,我认为每个内核有一个线程是最佳的。如果您有一个 4 核 CPU,您可以运行 4 个 CPU 密集型子例程实例而不会受到任何惩罚。例如,我曾经在一个四核 CPU 上实验性地运行了四个 CPU 密集型算法实例。每个过程最多四倍的时间没有减少。在第五个实例中,所有实例都花费了更长的时间。
阻塞操作的情况是什么?假设我有一个包含 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 一样多的线程。如果有一百万个 URL,那么一百万个线程将被启动。这是最优的,如果不是最优线程数是多少?对于任何可以等待的阻塞 I/O 操作(读取文件、数据库查询等),使用线程是一种很好的做法吗?
相关奖金问题
出于好奇,Perl 线程是否与 Python 和 GIL 一样工作?使用 python 来获得多线程的好处并利用所有内核执行 CPU 密集型任务,您必须使用多处理。