Какие реализации функциональных языков позволяют потокам работать параллельно?
Автор вопроса: J DОтветов: 8
Сборщик мусора OCaml накладывает глобальную блокировку, которая предотвращает параллельный запуск мутаторов (потоков), хотя они могут выполняться одновременно (с чередованием). Я считаю, что то же самое верно для SML/NJ и MLton, но не для PolyML, GHC, F#, Clojure и Scala.
Какие другие реализации функциональных языков позволяют потокам работать параллельно?
Я рад сообщить вам, что вы правы и что F#, основанный на CLR, вообще не страдает от этого ограничения, а вместо этого выигрывает от специфических функций многопоточности, включая асинхронные рабочие процессы, процессор почтовых ящиков и предстоящая замечательная задача (.NET 4.0) Параллельная библиотека.
Ответ 2 · рейтинг 11 · Norman Ramsey
Есть несколько хороших реализаций. На данный момент разработчики Haskell, похоже, добиваются лучших результатов (см. ICFP 2009). документ Саймона Марлоу и других, а также документ Haskell Symposium 2009 Донни Джонса и другие). Erlang довольно близко отстает, особенно если вы хотите стать распределенным.
Через шесть-двенадцать месяцев ответы могли измениться :-)
И Scala, и Clojure работают на JVM, что обеспечивает реальный параллелизм без каких-либо узких мест в одной точке конфликта.
Ответ 5 · рейтинг 6 · Gordon Guthrie
Erlang реализует свои собственные процессы и расписание процессов и позволяет запускать тысячи, десятки тысяч и даже миллионы процессов Erlang (внутри одного процесса операционной системы).
В SMP и многоядерных машинах виртуальная машина Erlang будет выделять столько потоков ОС и процессов ОС для своего планировщика процессов и очереди процессов, чтобы максимально использовать базовые параллельные операции в аппаратной архитектуре.
Конечно, парадигма параллелизма, доступная для приложений, остается прежней.
Ответ 6 · рейтинг 3 · Ben Griswold
Помимо Haskell, вы можете одновременно запускать процессы в Erlang (программирование, ориентированное на параллелизм), а также в F#, используя Параллельные расширения .NET и Асинхронные рабочие процессы.
Ответ 7 · рейтинг 1 · Makarius
Просто некоторые дополнения, чтобы подтвердить дальнейшие части спекулятивного списка:
Poly/ML поддерживает собственные потоки (потоки POSIX или потоки Windows), начиная с версии 5.2 (начиная с 2006 г.). Текущая версия Poly/ML 5.5 (лето 2012 г.) имеет улучшенную поддержку параллельного управления памятью: некоторые этапы сборки мусора используют несколько потоков, имеется специальная поддержка онлайн-обмена неизменяемыми значениями для уменьшения объема памяти, занимаемой огромными приложениями.
Isabelle/ML предоставляет дополнительную библиотеку будущего для потоков Poly/ML. Isabelle - это интерактивное средство доказательства теорем, но оно интегрировано с расширенной версией SML, основанной на Poly/ML.
Ответ 8 · SingleNegationElimination
python не особенно функциональный язык, и с GIL он тоже не очень параллелен, но в сочетании с многопроцессорный модуль (стандартный с версии 2.6), вы получаете оба, но он не так элегантен, как чистые функциональные языки.