Supervisor.Spec — 자식 스펙을 만드는

Supervisor.Spec — 자식 스펙을 만드는 (구식) 함수들

Supervisor.Spec는 슈퍼바이저가 감독할 자식(child)의 스펙(specification) 을 정의하는 편의 함수들을 담은 모듈이에요. 다만 이 모듈의 함수들은 deprecated(구식) 이고, Elixir v1.5에서 도입된 모듈 기반 자식 스펙과는 함께 동작하지 않아요.

출처: Supervisor.Spec — Outdated functions for building child specifications

본문

이 모듈의 함수들은 과거에 자식 스펙을 정의하는 데 쓰였어요. worker/3supervisor/3가 대표적인데, 이들은 Supervisor.start_link/2로 시작되는 슈퍼바이저 아래에서 어떤 자식들을 감독할지를 지정하는 데 사용했죠.

import Supervisor.Spec

children = [
  worker(MyWorker, [arg1, arg2, arg3]),
  supervisor(MySupervisor, [arg1])
]

Supervisor.start_link(children, strategy: :one_for_one)

현재는 Supervisor.Spec 대신 Supervisor 모듈 문서의 모듈 기반 자식 스펙을 사용하는 것을 권장해요. 최신 Elixir에서는 자식 스펙을 각 모듈의 child_spec/1 콜백으로 정의하고, use Agent, use GenServer 등이 자동으로 child_spec/1을 생성해 주기 때문에 굳이 이 구식 헬퍼를 쓸 필요가 없어요.

과거에 쓰이던 옵션들 (참고용)

이 모듈의 스펙 함수(worker/supervisor)는 다음과 같은 옵션을 받았어요.

  • :id — 슈퍼바이저가 내부적으로 자식 스펙을 식별하는 이름. 기본값은 모듈 이름.
  • :function — 자식을 시작하기 위해 호출할 함수.
  • :restart — 종료된 자식 프로세스를 언제 재시작할지를 정하는 아톰.
  • :shutdown — 자식 프로세스를 어떻게 종료할지를 정하는 아톰.
  • :modules — 콜백 모듈 이름을 담은 리스트. GenEvent:dynamic.

:restart 값은 다음 세 가지가 있었어요.

  • :permanent — 자식이 항상 재시작됨 (기본값)
  • :temporary — 절대 재시작되지 않음 (strategy가 :rest_for_one:one_for_all이어도 마찬가지)
  • :transient — 비정상적으로 종료될 때만 재시작 (:normal, :shutdown, {:shutdown, term} 외의 종료 이유일 때)

:shutdown 값은 다음 세 가지가 있었어요.

  • :brutal_killProcess.exit(child, :kill)로 무조건 종료
  • :infinity — 자식이 슈퍼바이저라면 하위 트리에 충분한 종료 시간을 주는 매커니즘. 워커에도 주의해서 쓸 수 있음
  • 음이 아닌 정수 — 슈퍼바이저가 Process.exit(child, :shutdown)을 호출하고 종료 신호를 기다리는 밀리초. 지정한 시간 안에 신호가 없으면 무조건 Process.exit(child, :kill)로 종료

참고: 이 모듈은 더 이상 쓰이지 않으므로, 새 코드에서는 Supervisor의 최신 자식 스펙 방식을 쓰세요.

더 알아보기

  • 대체: Supervisor 모듈의 모듈 기반 자식 스펙, child_spec/1 콜백
  • 관련: Supervisor.start_link/2, Supervisor.init/1