Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: J DОтветов: 8

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

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

parallel-processingfunctional-programming

Ответы

Ответ 1 · рейтинг 5 · em70

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

Ответ 2 · рейтинг 11 · Norman Ramsey

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

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

Ответ 4 · рейтинг 6 · Kevin Peterson

И 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), вы получаете оба, но он не так элегантен, как чистые функциональные языки.

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

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]"

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы