[clojure] Clojure 에이전트와 콜백(Callback) 함수

Clojure는 에이전트(Agent) 라는 독특한 기능을 제공하여 병행성을 다룰 수 있습니다. 에이전트는 불변 상태(Immutable state) 를 유지하면서 상태를 변경할 수 있는 병행 프로세스 입니다. 이러한 에이전트를 사용하여 비동기적으로 상태를 변경하고, 그 변경에 대한 결과를 처리하기 위해 콜백 함수(Callback function) 를 사용할 수 있습니다.

에이전트(Agent)란?

에이전트는 Clojure에서 병행 작업 을 수행하는 기본 단위입니다. 에이전트는 값이나 상태를 가지고 있으며, 해당 값을 변경할 수 있는 메서드를 가지고 있습니다. 그러나 이러한 변경은 동기적(Synchronous) 이 아닌 비동기적(Asynchronous) 으로 이루어지며, 에이전트의 상태 변경은 에이전트가 속한 에이전트 풀(Agent pool) 에 존재하는 하나 이상의 스레드에서 이루어집니다.

에이전트 변경은 다른 에이전트 변경과는 독립적입니다. 따라서 에이전트 변경은 경쟁 조건이나 데드락과 같은 문제를 발생시키지 않습니다.

콜백 함수(Callback function)

에이전트의 값이나 상태가 변경되면, Clojure는 변경 사실을 감지하고 설정된 콜백 함수를 호출합니다. 이를 통해 변경 사실에 대한 특정 작업을 수행할 수 있습니다. 콜백 함수는 함수의 형태를 가지며, 에이전트가 변경될 때 호출되어야 하는 로직을 담고 있습니다.

에이전트와 콜백 함수 사용 예제

다음은 Clojure에서 에이전트와 콜백 함수를 사용하는 간단한 예제입니다.

(def a (agent 0))

(defn callback [old-state new-state]
  (println "에이전트 값이 변경되었습니다." old-state "에서" new-state "로 변경됨"))

(add-watch a :callback callback)

(send-off a inc)
; 에이전트 값이 변경되었습니다. 0 에서 1 로 변경됨

위 예제에서 def a (agent 0) 를 통해 값을 0으로 초기화한 후, add-watch 함수를 사용하여 :callback 키와 함께 callback 함수를 등록하였습니다. 그 후 send-off 함수를 통해 inc 함수를 호출하여 에이전트의 값을 증가시켰을 때, 등록된 콜백 함수가 호출되어 “에이전트 값이 변경되었습니다.”라는 메시지가 출력됩니다.

에이전트와 콜백 함수를 사용하여 Clojure에서 상태 변경에 따른 특정 작업을 비동기적으로 처리할 수 있습니다.

참고 문헌: Clojure Reference - Agents, ClojureDocs - Agents