сколько потоков используют параллельные коллекции 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 поток на ядро.