сколько потоков используют параллельные коллекции scala по умолчанию?
когда я называю Array.tabulate(100)(i=>i).par map { _+ 1}
, сколько потоков используется?
спасибо
3 ответов
предполагая, что нет одновременно запущенных процессов и/или потоков, что означает, что все ЦП и ядра простаивают, это будет 1 поток на логический процессор на ЦП. Например, если у вас есть процессор Intel с 4 ядрами, но эти ядра имеют гиперпоточность, то будет 8 рабочих потоков, выполняющих параллельную операцию..
в любом случае, это то же самое значение, возвращаемое availableProcessors
метод в JDK.
имейте в виду, что tabulate
вызов в вашем примере не параллельный-он выполняется последовательно.
для par map на массивах scala использует пользовательскую реализацию по умолчанию ForkJoinThreadPool, которая использует количество обнаруженных процессоров из среды выполнения java. Вы можете видеть это здесь:
public ForkJoinPool() {
this(Math.min(MAX_CAP, Runtime.getRuntime().availableProcessors()),
defaultForkJoinWorkerThreadFactory, null, false);
}
согласно комментарию этой post, значение по умолчанию-1 поток на ядро.