В приведенном выше коде parallely
решил создать по одному потоку на Haskell для каждого элемента в списке getAggregateIds
, то есть [1,2,3,1,2,3]
.parallely
не заботится о наличии дублирующих элементов в списке: он просто запускает поток для каждого.
В принципе, parallely
может выделить только небольшое количество потоков Haskell и использовать их позже(возможно, для того же дубликата или другого идентификатора), но при этом не будет никакого увеличения производительности.Действительно, решающая часть здесь заключается в том, что выделяется поток Haskell, а не поток ОС,
Потоки Haskell очень легкие, они используют очень мало памяти, и поэтому они очень дешевы в создании и удалении.Попытка их повторного использования может привести к снижению производительности.
Кроме того, среда выполнения Haskell может выполнять множество потоков Haskell в потоках одной ОС.Обычно небольшой пул потоков ОС хранится во время выполнения, и потоки Haskell сопоставляются с ними.Поскольку потоки ОС не так легки, потоки ОС действительно повторно используются между потоками Haskell.
Наконец, обратите внимание, что ThreadId
- это имя потока Haskell, а не ОС, поэтому нормально не видеть повторного использования.из этих идентификаторов.