Если вы выполняете интенсивные задачи с ЦП, я считаю, что оптимально иметь один поток на ядро. Если у вас 4-ядерный процессор, вы можете запускать 4 экземпляра подпрограммы с интенсивным процессором без каких-либо штрафных санкций. Например, я однажды экспериментально выполнил четыре экземпляра процессора с интенсивным алгоритмом на четырехъядерном процессоре. До четырех раз время процесса не уменьшалось. В пятых случаях все экземпляры занимали больше времени.
Что такое блокировка операций? Скажем, у меня есть список из 1000 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-адресов, тогда будет выпущено миллион потоков. Является ли это оптимальным, если не оптимальным числом потоков? Является ли использование потоков хорошей практикой для ЛЮБЫХ блокирующих операций ввода-вывода, которые могут ждать (чтение файла, запросы к базе данных и т.д.)?
Связанный бонусный вопрос
Из любопытства потоки Perl работают так же, как Python и GIL? С помощью python, чтобы получить преимущество многопоточности и использовать все ядра для задач с интенсивным процессором, вы должны использовать многопроцессорность.