ets 테이블에 프로세스 상태를 저장하면 충돌 사이에 상태를 유지하는 데 효과적 일 수 있으며 일반적으로 프로세스에 영구적 인 이름을 부여하기 위해 전역 레지스트리를 사용합니다. (플레이어 200은 {player, 200}으로 등록 될 것입니다.) 원자를 사용해야하고 많은 자식 프로세스가있는 경우 로컬 레지스트리를 사용하지 않는 것이 좋습니다. 동적으로 (player_200, player_201 등)
ets 테이블에 자식 상태를 저장하는 것은 자체 위험과 문제가 있습니다. 오류가 발생하는 순간과 ets 테이블에 저장하는 사이에 자식이 충돌하면 문제가 발생하지 않습니다. 그러나 자식이 가비지 상태를 저장하도록하는 데이터를 처리 한 후 다음 메시지 처리시 충돌이 발생합니다. 프로세스를 다시 시작하고 ets 테이블에서 잘못된 상태를로드하고 다음 메시지를 다시 충돌시킵니다. 이 문제를 해결할 확실한 방법이 있지만, 가능성과 주위를 해결해야한다는 것을 알고 있어야합니다.
얼랭 (Erlang)은 ets 테이블을 모든 프로세스에 배포하는 문제를 숨기지 만, CPU 및 잠재적 인 경합을 희생하면서이를 수행합니다. ets 테이블에 많은 변경 사항을 적용한다면 성능면에서 비용을 지불하게됩니다.
자녀가 충돌하는 경우, 어쨌든 잘못된 조건을 제거 할 수있는 방법을 찾고 있지 않아야합니까? 보통 프로세스 크래시를 원인과 수정의 근본 원인으로 생각했습니다. ?
ets 테이블을 사용하여 자식 프로세스 상태를 저장하는 데 가장 큰 걱정거리는 잠재적 인 병 목입니다. 많은 프로세스가 상태를 변경하는 경우 변경이 발생할 때마다 ets 테이블을 새로운 상태로 업데이트해야합니다. 아이가 죽을 때마다 나는 충돌 이전과 같은 상태로 재시작해야한다. 아이 프로세스가 죽을 때마다 { 'EXIT', Pid, Reason}을 보내 감독자에게 알린다. 자식 프로세스가 충돌 이전에 상태를 보낼 수도있는 경우 동일한 상태로 다시 시작할 수 있으므로 업데이트를 테이블에 보내지 않아도됩니다. – Mark
얼랑 (Erlang)에서는 가능하지 않다고 생각하지만 일반적으로 멋진 기능이라고 생각합니다. 자식 충돌시 감독자에게 프로세스 스택을 보내는 것과 같은 것 – Mark
@Mark 내 대답에서 내가 언급 한 기사는 소유 프로세스가 충돌 할 때 ETS 테이블 gifting/상속을 다른 프로세스에 사용하는 방법을 설명합니다. – johlo