Supervisor.Spec — 자식 스펙을 만드는
Supervisor.Spec — 자식 스펙을 만드는 (구식) 함수들
Supervisor.Spec는 슈퍼바이저가 감독할 자식(child)의 스펙(specification) 을 정의하는 편의 함수들을 담은 모듈이에요. 다만 이 모듈의 함수들은 deprecated(구식) 이고, Elixir v1.5에서 도입된 모듈 기반 자식 스펙과는 함께 동작하지 않아요.
출처: Supervisor.Spec — Outdated functions for building child specifications
본문
이 모듈의 함수들은 과거에 자식 스펙을 정의하는 데 쓰였어요. worker/3와 supervisor/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_kill—Process.exit(child, :kill)로 무조건 종료:infinity— 자식이 슈퍼바이저라면 하위 트리에 충분한 종료 시간을 주는 매커니즘. 워커에도 주의해서 쓸 수 있음- 음이 아닌 정수 — 슈퍼바이저가
Process.exit(child, :shutdown)을 호출하고 종료 신호를 기다리는 밀리초. 지정한 시간 안에 신호가 없으면 무조건Process.exit(child, :kill)로 종료
참고: 이 모듈은 더 이상 쓰이지 않으므로, 새 코드에서는
Supervisor의 최신 자식 스펙 방식을 쓰세요.
더 알아보기
- 대체:
Supervisor모듈의 모듈 기반 자식 스펙,child_spec/1콜백 - 관련:
Supervisor.start_link/2,Supervisor.init/1