Что такое "искра" в Haskell
Я запутался в понятии "искра"
Это поток в Haskell? Или это действие нереста новой нити?
Спасибо всем:
Итак, чтобы скомпоновать, искры не являются потоками, а больше единиц вычисления (задачи для размещения в терминах С#/Java). Таким образом, Haskell реализует задачу parallelism.
Ответы
Ответ 1
См. Нежное введение в Глазго Параллельный Haskell.
Parallelism вводится в GPH комбинатором par
, который принимает два аргумента, которые должны оцениваться параллельно. Выражение p `par` e
(здесь мы используем нотацию Haskell для инфиксного оператора) имеет то же значение, что и e
, и не является строгим в своем первом аргументе, т.е. bottom `par` e
имеет значение e
. (bottom
обозначает вычисление без окончания или неудачи.) Его динамическое поведение состоит в том, чтобы указать, что p
может быть оценено новым параллельным потоком, при этом родительский поток продолжает оценивать e
. Мы говорим, что был вызван p
, и впоследствии может быть создан поток, чтобы оценить его, если процессор простаивает. Поскольку поток не обязательно создается, p
похож на ленивое будущее.
[Акцент в оригинале]
Ответ 2
Искры не являются нитями. forkIO
представляет потоки Haskell (которые отображают меньше реальных потоков ОС). Sparks создают записи в рабочих очередях для каждого потока, из которых они будут выполнять задачи для выполнения, если поток становится бездействующим.
В результате искры очень дешевы (у вас могут быть миллиарды из них в программе, в то время как у вас, вероятно, не будет более миллиона потоков Haskell и менее дюжины OS-потоков на полдюжины ядер).
Подумайте об этом так:
![spark model]()
Ответ 3
Если я правильно понимаю, искра - это запись в очередь заданий, требующих работы. Пул потоков принимает записи из этой очереди и запускает их. Как правило, на физический процессор имеется один поток, поэтому эта схема максимизирует пропускную способность и минимизирует переключение контекста потока.
Ответ 4
Похоже, что он похож на "задачу" в Intel Threading Building Blocks.