Похож ли Clojure core.async на OCaml Core Async Джейн Стрит?

В этом сообщении в блоге автор пишет:

Однако Grenchman построен на основе библиотек Core и Async от Jane Street, одного из крупнейших промышленных пользователей OCaml. Async допускает монадический ложный параллелизм, который позволяет избежать головной боли с обратными вызовами других инструментов, управляемых событиями, но он довольно монолитный.

На странице документации Jane Street для Core Async они описывают это так:

В частности, мы считаем, что Async лучше контролирует параллелизм вашей программы, облегчая анализ возможных условий гонки.

Мой вопрос: есть ли сходство между core.async в Clojure и Core Async в OCaml? Я спрашиваю, потому что «искусственный параллелизм, чтобы избежать головной боли с обратными вызовами» звучит очень похоже на применение core.async в Clojure.


person hawkeye    schedule 14.10.2013    source источник


Ответы (1)


Я не могу обнаружить большое сходство. Концепция Clojure core.async, по-видимому, в основном основана на модели параллелизма Go — многие имена совпадают, например, каналы для связи и даже макрос go для асинхронного выполнения кода, например ключевое слово Go, по которому назван сам язык.

С другой стороны, концепция Async Джейн Стрит резюмируется в этом предложении из вводной документации. :

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

Он использует специальный тип Deferred.t для передачи результатов асинхронных вычислений, который больше похож на фьючерсы Clojure, чем на каналы. Он также полностью избегает потоков ОС и вместо них использует пользовательские потоки, тогда как core.async использует потоки ОС (по крайней мере, если они доступны).

Редактировать. Дальнейшие исследования показали явное сходство в том, что обе библиотеки ориентированы на предоставление средств для объединения нескольких блокирующих операций без связывания потоков ОС. И Async также предоставляет (помимо Deferred.t) каналы через модуль Pipe.

person Rörd    schedule 14.10.2013
comment
Если я новичок, есть ли что-то, что вы порекомендуете? - person BlueTrin; 28.05.2014
comment
@BlueTrin: Поскольку одна из них — библиотека OCaml, а другая — для Clojure, я бы посоветовал выбирать на основе того языка, который вам более удобен / имеет другие функции или библиотеки (помимо поддержки параллелизма), которые вам нужны. Для хороших высокоуровневых библиотек параллелизма обе они выполняют свою работу, хотя Clojure, в частности, также имеет хорошую поддержку других моделей параллелизма в стандартной библиотеке. - person Rörd; 28.05.2014