Не совсем понимаю детерминизм в контексте concurrency и parallelism в Haskell. Некоторые примеры были бы полезны. Благодаря
Почему одновременный haskell не детерминирован, а параллельные примитивы haskell (par и pseq) детерминированы?
Ответ 1
При работе с чистыми значениями порядок оценки не имеет значения. Это по существу то, что делает parallelism: оценка чистых значений параллельно. В отличие от чистых ценностей, порядок обычно имеет значение для действий с побочными эффектами. Выполнение одновременных действий называется concurrency.
В качестве примера рассмотрим два действия putStr "foo"
и putStr "bar"
. В зависимости от порядка, в котором эти два действия оцениваются, выход представляет собой либо "foobar", "barfoo", либо любое состояние между ними. Результат индивидуализирован, так как зависит от конкретного порядка оценки.
В качестве другого примера рассмотрим два значения sum [1..10]
и 5 * 3
. Независимо от порядка, в котором эти два оцениваются, они всегда сводятся к тем же результатам. Этот детерминизм - это то, что вы обычно можете гарантировать только чистыми значениями.
Ответ 2
Concurrency и parallelism - две разные вещи.
Concurrency означает, что у вас несколько потоков, которые не детерминированы. Например, у вас может быть сервер чата, где каждый клиент обрабатывается одним потоком. Недетерминизм необходим для системы, которую вы пытаетесь моделировать.
Parallelism - это использование нескольких потоков для простого запуска вашей программы. Однако конечный результат должен быть таким же, как если бы вы выполняли алгоритм последовательно.
У многих языков нет примитивов для parallelism, поэтому вам нужно реализовать его с помощью примитивов concurrency, таких как потоки и блокировки. Однако это означает, что вы, программист, должны быть осторожны, чтобы не случайно вводить нежелательный недетерминизм или другие проблемы concurrency. С явными примитивами parallelism, такими как par
и pseq
, многие из этих проблем просто исчезают.