Параллельное программирование в Haskell - PullRequest
3 голосов
/ 29 апреля 2019

Два (связанных) вопроса о параллельном программировании в Haskell по сравнению с Java / Scala:

  1. Что использует Haskeller для параллельных структур данных?Есть ли что-нибудь аналогичное Java java.util.concurrent.{ConcurrentHashMap, ConcurrentSkipListSet, ..}.MVar (Map k v) не не считается :).Общее изменяемое состояние является злом, но иногда необходимо.

  2. Есть ли эквивалент Java ExecutorService?Потоки AFAIK, Haskell (см. fork#, yield# и т. Д. В GHC.Exts) запланированы с помощью чего-то встроенного в RTS.Но что, если я специально хочу использовать пул разветвления или запланировать некоторые вычисления в пуле потоков?Возможность использовать Future в определенных контекстах выполнения очень удобна в Scala, и я не знаю, как это сделать в Haskell.

1 Ответ

3 голосов
/ 30 апреля 2019

На эту тему можно написать целую книгу, поэтому я постараюсь затронуть только те вопросы, о которых вы спрашиваете.

  • Вы можете использовать комбинатор parзапланировать чистых вычислений, которые будут выполнены в какой-то момент в будущем.Для этого RTS уже реализует очереди для кражи работы, а уже поддерживает один поток на ядро ​​ЦП для их запуска.(Если вы свяжете свою программу с соответствующими переключателями.) Обратите внимание, что это не поможет ни на один бит для нечистого кода и не позволит вам указать, в каком потоке или на каком ядре выполняется код.

  • Для общего изменяемого хранилища у вас есть два варианта.

    • Явная блокировка с использованием MVar.Это имеет все обычные ловушки блокировки в других языках программирования.(Блокировка, забвение блокировки вещей, блокировка слишком многих вещей, блокировка слишком долго, не блокировка достаточно долго ...) Так что MVar (Map k v) абсолютно считается!

    • STM.Вы, кажется, неправильно понимаете, что это делает.Весь смысл в STM состоит в том, что вам не нужны блокировки .Он позволяет вам использовать совместно изменяемые структуры данных «как если бы», они не являются общими, но он автоматически предотвращает скачки данных, несогласованное состояние и все другие обычные проблемы, связанные с неиспользованием блокировок.Это также позволяет потоку ожидать нескольких условий одновременно.Это невероятный фреймворк!

  • Если вы хотите запустить код в определенном потоке ОС, вы, вероятно, ищете forkOS, а не forkIO.

Учитывая ваш вариант использования, я подозреваю, что STM, вероятно, то, что вы ищете.Если у вас есть конкретное задание, которое вы пытаетесь выполнить, опубликуйте другой вопрос, и вы, вероятно, получите более конкретный совет.

...