Как уже много раз указывалось, Clojure — это язык программирования, в котором многие типы данных являются неизменяемыми, что означает, что единственный способ изменить значение переменной — это создать новую переменную и присвоить ей новое значение. Однако Clojure предоставляет некоторые элементы, которые могут создавать изменяемое состояние. Мы видели, что этого можно достичь с помощью типа данных atom. Другой способ добиться этого — через агентов.
Агенты обеспечивают независимую, асинхронную смену отдельных местоположений. Агенты привязаны к одному хранилищу в течение своего срока службы и допускают только мутацию этого местоположения (в новое состояние) в результате действия. Действия — это функции (с, необязательно, дополнительными аргументами), которые асинхронно применяются к состоянию Агента и возвращаемое значение которых становится новым состоянием Агента.
Следующие операции возможны в Clojure в отношении Агентов.
Агент создается с помощью команды агента.
Эта функция используется для отправки значения агенту.
Эта функция используется для выключения любых работающих агентов.
В некоторых случаях агенту назначается функция, которая по своей природе блокирует.
Поскольку при обновлении значения агента существует задержка, Clojure предоставила функцию «ожидания», которая используется для указания времени в миллисекундах, в течение которого следует ожидать обновления агента.
Блокирует текущий поток (на неопределенный срок!) До тех пор, пока не будут выполнены все действия, отправленные до сих пор из этого потока или агента агенту (агентам). Будет заблокирован на сбой агентов.
Возвращает исключение, выданное во время асинхронного действия агента, если агент завершается ошибкой. Возвращает ноль, если агент не терпит неудачу.