LINUX.ORG.RU

clojure: atom/agent vs STM

 , ,


1

5

Интересует мнение практиков. Поделитесь опытом, пожалуйста. Когда и для чего вы применяете STM, а когда atom или agent. Что оказывается лучше в каких ситуациях? Понятно, что если объект один, то лучше atom/agent, но вот в случае более сложных структур, что обычно предпочтительнее, завести группу ссылок и действовать через stm или же сгруппировать данные в структуру и завести один atom/agent для этого? Чем руководствоваться в выборе? Есть ли исследования и полезные ссылки?


Использую atom как изменяемую «переменную».

holuiitipun ()

Атом и агент - это разные вещи. Атом - атомарное конкурентное изменение, а агент - последовательное, т.к. все операции изменения выстраиваются в очередь. Есть ещё ссылки (ref), их нужно использовать когда необходимо обеспечить транзакционное изменение. А сам STM (вместе со всем, что выше описано), использую почти всегда. Довольно удобно и сухо (безопасно).

turtle_bazon ★★★ ()

Можно всю сложную структуру держать под одним атомом. Всё зависит от целей и требований.

turtle_bazon ★★★ ()
Ответ на: комментарий от turtle_bazon

Атом и агент - это разные вещи. Атом - атомарное конкурентное изменение, а агент - последовательное, т.к. все операции изменения выстраиваются в очередь.

Да, спасибо. С этим вроде ясно. Неясно, когда нам вместо агента или атома на сгруппированные данные, лучше иметь набор ссылок, изменяемых в рамках транзакции.

Есть ещё ссылки (ref), их нужно использовать когда необходимо обеспечить транзакционное изменение.

Это тоже понятно.

А сам STM (вместе со всем, что выше описано), использую почти всегда. Довольно удобно и сухо (безопасно).

Эм. Атомы вроде не имееют отношения к STM. Да и агенты тоже, хотя и в транзакциях агенты, как я понял, обрабатываются особым образом и изменения продвигаются только в случае успеха транзакции.

forCe ()
Ответ на: комментарий от turtle_bazon

Можно всю сложную структуру держать под одним атомом.

Ага, в этом и вопрос. Когда нам лучше поступить так, а когда лучше иметь ссылки и менять их в рамках транзакции?

Всё зависит от целей и требований.

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

А еще какие примерно цели/требования сказываются на выборе в данном случае? Что можно сказать о производительности?

forCe ()
Последнее исправление: forCe (всего исправлений: 1)
Ответ на: комментарий от forCe

Неясно, когда нам вместо агента или атома на сгруппированные данные, лучше иметь набор ссылок, изменяемых в рамках транзакции.

It depends. Т.е. прямо сейчас нельзя сказать что лучше. Нужно смотреть в рамках задачи.

Эм. Атомы вроде не имееют отношения к STM.

Ну как не имеют? Очень даже являются понятиями из STM. STM же обеспечивает тебе другой механизм локинга и т.д., нежели «традиционный» подход. Но для этого выстраиваются объекты. Тот же атом. Собственно, swap! - это как раз операция изменения атома, которая оперирует снапшотом и не лочит на всю длительность изменения. Агенты и ссылки оттуда же. Просто мы привыки в clojure иметь в виду атом как изменяемая переменная, но это лишь сбоку бантик.

turtle_bazon ★★★ ()
Ответ на: комментарий от forCe

Можете немного раскрыть тему?

Без конкретных примеров сложно рассуждать. А с конкретными - долго. :)

Конкретно по счетам. Можно хранить счета в одной структуре. И даже перевод со счёта на счёт будет транзакционным и в пределах атома, потому что будет модифицироваться одной функцией с одним снапшотом. Но тогда параллельная работа нескольких счетов будет затруднена, потому что нужно будет постоянно модифицировать одну большую структру. Тут надо просто что-то поделать. Пока просто читаешь - сложно понять.

turtle_bazon ★★★ ()
Ответ на: комментарий от turtle_bazon

Очень даже являются понятиями из STM. STM же обеспечивает тебе другой механизм локинга и т.д., нежели «традиционный» подход. Но для этого выстраиваются объекты. Тот же атом. Собственно, swap! - это как раз операция изменения атома, которая оперирует снапшотом и не лочит на всю длительность изменения.

Атомы - это просто атомики. Они и реализованы, причем довольно прозрачно через атомики из java.util.concurrent.atomic. Это действительно не STM. Там просто CAS-операция под капотом. Вызываем функцию изменения, валидаторы и т.п., потом делаем CAS, если не успешно - повторяем.

anonymous ()
Ответ на: комментарий от anonymous

STM без этих атомов он как бы и не STM. А то, как реализовано - это деталь реализации. Если я неправ - поясните ссылками на спеки.

turtle_bazon ★★★ ()
Последнее исправление: turtle_bazon (всего исправлений: 1)
Ответ на: комментарий от turtle_bazon

STM - это транзакционная память. Т.е. к STM относятся транзакции, ссылки и пр. Атомы и Агенты - отдельные механизмы.

Там даже разделы документации разные

Atoms

Agents and Asynchronous Actions

Refs and Transactions

Да, агенты интегрированы с SMT, в том смысле, что агентам все send'ы пойдут только в случае успешной транзакции, но являются отдельным механизмом.

anonymous ()
Ответ на: комментарий от anonymous

А со ссылками на спеку STM, а не clojure доки? Пока не убедительно.

turtle_bazon ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.