Какие реализации функционального языка позволяют потокам работать параллельно? - PullRequest
5 голосов
/ 13 июля 2009

OCaml GC устанавливает глобальную блокировку, которая не позволяет мутаторам (потокам) работать параллельно, хотя они могут работать одновременно (с чередованием). Я считаю, что то же самое относится и к SML / NJ и MLton, но не к PolyML, GHC, F #, Clojure и Scala.

Какие еще реализации функционального языка позволяют потокам работать параллельно?

Ответы [ 8 ]

11 голосов
/ 13 июля 2009

Существует множество хороших реализаций. В настоящий момент, похоже, что люди из Haskell получают лучшие результаты (см. Статью ICFP 2009 Саймона Марлоу и др. , а также статью Haskell Symposium 2009 Донни Джонс и др. ). Эрланг довольно близко позади, особенно если вы хотите распространяться.

Через шесть-двенадцать месяцев ответы могли измениться: -)

6 голосов
/ 13 июля 2009

Erlang реализует свои собственные процессы и расписание процессов и допускает тысячи, десятки тысяч и даже миллионы процессов Erlang (в рамках одного процесса операционной системы).

В SMP и многоядерных машинах виртуальная машина Erlang выделит столько потоков ОС и процессов ОС для своего планировщика процессов и очереди процессов, чтобы максимально использовать базовые параллельные операции в аппаратной архитектуре.

Парадигма параллелизма, предоставляемая приложениям, конечно, остается прежней.

6 голосов
/ 13 июля 2009

Scala и Clojure работают на JVM, что обеспечивает реальный параллелизм без каких-либо узких мест конкуренции.

6 голосов
/ 13 июля 2009
5 голосов
/ 13 июля 2009

Я рад сообщить вам, что вы правы и что F #, основанный на CLR, вообще не страдает от этого ограничения и вместо этого получает выгоду от многопоточных специфических функций, включая асинхронные рабочие процессы , обработчик почтовых ящиков и замечательная предстоящая (.NET 4.0) параллельная библиотека задач.

3 голосов
/ 13 июля 2009

В дополнение к Haskell вы можете одновременно запускать процессы в Erlang (параллельное программирование), а также в F #, используя .NET Parallel Extensions и Асинхронные рабочие процессы .

1 голос
/ 05 марта 2013

Просто некоторые дополнения, чтобы подтвердить дальнейшие части спекулятивного списка:

  • Poly / ML поддерживает собственные потоки (потоки POSIX или Windows) начиная с версии 5.2 (с 2006 года). В текущей версии Poly / ML 5.5 (лето 2012 г.) улучшена поддержка параллельного управления памятью: в некоторых фазах GC используется несколько потоков, имеется специальная поддержка онлайн-обмена неизменяемыми значениями для сокращения объема памяти огромных приложений.

  • Isabelle / ML предоставляет дополнительную библиотеку для будущих потоков Poly / ML. Изабель - интерактивная программа проверки теорем, но она интегрирована с расширенной версией SML на основе Poly / ML.

0 голосов
/ 13 июля 2009

python не является особо функциональным языком, и с GIL он тоже не очень параллелен, но в сочетании с модулем multiprocessing (стандартно с 2.6) вы получаете оба, но это не совсем элегантный, как чисто функциональные языки.

Краткий пример:

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=4)              # start 4 worker processes
    result = pool.apply_async(f, [10])     # evaluate "f(10)" asynchronously
    print result.get(timeout=1)           # prints "100" unless your computer is *very* slow
    print pool.map(f, range(10))          # prints "[0, 1, 4,..., 81]"
...