Ag

Agent 에서 Elixir

3개의 연습 문제

Agent 소개

프로세스를 생성하는 일은 쉽지만, 그 상태와 동작을 관리하는 일은 아주 복잡해질 수 있어요. Agent 모듈은 Elixir 프로세스에서 공유 상태를 관리하기 쉽게 해 주는 추상화예요.

Agent 모듈의 함수를 사용할 때는 에이전트와 관련된 함수를 하나의 모듈에 모아 두는 것이 관례예요.

# A simple use of agent processes to represent a counter
defmodule Counter do
  def start_link(initial_value) do
    Agent.start(fn -> initial_value end)
  end

  def value(pid) do
    Agent.get(pid, & &1)
  end

  def increment(pid) do
    Agent.update(pid, &(&1 + 1))
  end
end

Agent 모듈을 쓸지, 아니면 여러 프로세스를 아예 쓸지 하는 선택은 데이터로 모델링하려는 관계에 따라 달라요. _Agent 프로세스_는 여러 프로세스가 공유 상태를 사용해야 할 때 유용해요.

별도의 프로세스를 두지 않고 함수 안의 변수로 상태를 담는 편이 더 나은 선택인 경우가 많아요. 그리고 이를 무턱대고 전역 변수처럼 다루지 않도록 주의해야 해요. 다른 프로세스가 값을 조작해서 경쟁 조건이나 추적할 수 없는 오류를 만들 수 있거든요.

_Agent 프로세스_를 쓰기로 했다면, 목표는 단순한 상태를 담는 것이어야 하고, _Agent 프로세스_에 대한 호출은 모듈 안에 캡슐화해서 호출을 한데 모아 정리하는 게 좋아요.

비용이 많이 드는 작업을 다른 프로세스에서 처리해야 한다면 Task 프로세스(Task 사용)를 고려해 봐요. 프로세스가 상태를 보관하면서 동작까지 수행해야 한다면 GenServer 프로세스(GenServer 사용)를 고려해 봐요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요

Agent 배우기

연습이 잠겨 있어요

Agent 개념을 연습하려면 연습 문제 1개를 더 잠금 해제해요