2014-11-07 5 views
5

Является ли core.async заменой Lamina или намерен стать заменой Lamina?Clojure core.async и Lamina

Если нет, существуют ли четкие ситуации, когда предпочтительнее другого?

+0

Многие разновидности параллелизма в Clojure могут быть интересными - http://adambard.com/blog/clojure-concurrency-smorgasbord/ – edbond

+0

Я видел это, и хотя это была отличная статья, это было слишком «хорошо», чтобы ответить на мой вопрос, я думаю. – shmish111

ответ

13

Я являюсь автором Lamina. Я думаю, что core.async - это хорошо сделанная библиотека, с большей четкостью в дизайне, чем Lamina. Есть вещи, которые, на мой взгляд, лучше Ламина, в основном связанные с интроспекцией, эффективностью и расширяемостью.

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

Я видел несколько «асинхронных» библиотек, которые отображали потоки как каналы core.async, а это значит, что вы можете использовать библиотеки только в том случае, если вам удобно использовать модель выполнения core.async.

Я собираюсь выпустить библиотеку, которая пытается быть «минимальным» представлением потока, которое может быть использовано вместо core.async, Lamina, очереди блокировки Java и т. Д. Под названием Manifold. Поток манифольда может быть принудительно подключен к каналу core.async, каналу Lamina и т. Д., И любая из этих вещей может быть принудительно возвращена в поток Manifold.

Я думаю, что «асинхронный» пейзаж все еще довольно молодой, и есть много неисследованных проблем w.r.t. насколько хорошо масштабируются абстракции, насколько легко они отлаживаются в производстве и т. д. JVM предоставляет множество инструментов для интроспекции, но поскольку механизмы асинхронного использования используют совершенно другую модель исполнения, мы в основном начинаем снова с нуля. Я бы не сказал вам использовать Lamina над core.async, но я бы предостерег, что core.async - это абстракция уровня приложения, а не уровень библиотеки.

+0

Большое спасибо за это, всегда лучше услышать от авторов. Я не понимал, что о core.async и хорошей вещи, чтобы рассмотреть. Я прочитаю логический документ для Manifold, но сейчас немного поздно в пятницу. – shmish111

+0

Многообразие выглядит неплохо, конечно, но мне все же нужно сделать выбор за ним. Кажется, что Lamina и core.async, вероятно, будут оставаться как разные стратегии для достижения одной и той же конечной цели. Я думаю, что я буду играть больше с Lamina, поскольку он уже находится в нашей базе кода, однако core.async позволил мне просто обернуть что-то в блоке go и увидеть массовое увеличение производительности, не изменяя способ, которым я думаю об этом фрагменте код. – shmish111

+0

Теперь я вижу, что Ламина устарела.Я использую Manifold на данный момент для клиента Kafka, кажется, идеально подходит, потому что я могу создать простую библиотеку, которая возвращает поток, и люди могут использовать его, как им нравится, как канал, seq, поток коллектора и т. Д. (при условии, что это работает :))! – shmish111

3

core.async и Lamina - это два разных проекта, и они не предназначены для замены друг друга. Собственно, они могли бы сыграть красиво вместе, если хочешь.
Lamina - ориентированный на поток подход, а core.async - сообщение предназначенный.

Какой из них вам нужен. В Lamina важны обратные вызовы, которые вы определяете для канала, а в core.async, каналы и go блоки развязаны, и это более гибкое и модульное.

+0

Итак, я бы предположил, что создатели core.async подумают, что это лучший способ сделать что-то, чем Ламина, нет? – shmish111

+0

@ shmish111 Я не знаю, лучше спросить их :) Учитывая мой ответ, я не имел в виду core.async лучше, чем Lamina – Chiron

+0

Я сказал, что, как я только что смотрел рассказ Rich Hickey о core.async;) – shmish111