2014-12-16 1 views
1

나는 자식이 특정 값을 가지고있는 프로그램을 만들지 만 언제든지 출구로 나가려면 die 메시지를받을 수있다. 또한 나는 자녀들이 자신들이 여전히 살아 있는지 여부를 확인하기 위해 자녀들과 연결되어 그들의 출구를 걸러내는 모니터링 과정을 가지고 있습니다. 아이가 사망 한 경우, 모니터는 종료 메시지를 받고, 아이를 다시 등록하고, 필요한 경우 동일한 상태/값으로 아이를 다시 스폰합니다. 모니터는이를 통해 모든 아이들이 결코 등록 된 이름으로 찾아 낼 수 없도록합니다.자녀가 퇴장 한 후 어떻게 그 상태를 볼 수 있습니까?

그래서 내 질문은 : 부모가 종료에서 아이를 갇혀

  • 때문에 그것의 현재 상태를 얻기 위해, 종료 후, 여전히 아이를 접촉 할 수있을 것인가? 아니면 아이가 관계없이 퇴장 했습니까?
  • 동일한 이름과 값을 가진 자식을 어떻게 다시 등록 할 수 있습니까? 나는 모든 아이들의 가치에 대한 기록을 남겨야 하는가 아니면 얼랑의 어떤 마법을 통해 그 가치를 찾아내는 다른 방법이 있을까요?

답변

1

supervisor을 다시 구현하는 것과 같은 소리가납니다. 교육 목적 때문이 아니라면 supervision을 읽어보십시오.

방금 ​​배우는 분은 다음과 같습니다. 당신은 "부모가 갇힌 자식을 빠져 나가는 것"이라고 썼습니다. 트래핑 종료는 그렇게 작동하지 않습니다. 프로세스는 자체에 대해서만 trap_exit 플래그를 설정할 수 있습니다. 다른 프로세스가 exit(Pid, Reason)으로 종료하려고 할 때 사용됩니다. 죽어가는 대신에 process_flag(trap_exit, true)라고 불리는 과정에서 메시지를 받게됩니다. 심지어 그것을 무시하고 작업을 계속할 수도 있습니다.

예를 들어, 자식이 종료를 트래핑하고 누군가 종료하려고하면 메시지를 받고 exit({Reason, State}) (으)로 전화를 겁니다. 이렇게하면 모니터링 과정에서 자녀가 사망했다는 통지가있는 상태가됩니다. 그런 다음 원래 상태로 새 프로세스를 다시 생성하고 다시 등록 할 수 있습니다.

귀하의 질문에 답하십시오. 종료 한 프로세스에 연락 할 수 없습니다. 새 프로세스를 생성하고 이전 상태를 공급 한 다음 다시 등록해야합니다.

+0

실제로 교육 목적으로 (읽기 : 숙제) 종료 메시지를 통해 상태를 전송하는 방식으로 구현했습니다. 나는 그것이가는 길보다 더러운 해킹 같은 느낌이 들었다는 것을 인정해야합니다 ... 아니면 이것이 얼랭 방식입니까? 나는 실제로 아이들에게 죽을 것을 지시하는 과정을 가지고 있으며, 그들은 exit (살해)를 호출해야하므로 exit ({killed, State})로 바 꾸었습니다. 그러나 이것이 길 일지의 여부는 확실하지 않았습니다. –

+0

숙제는 당신이하지 말아야 할 일을 요구하기 때문에 해커입니다. 프로세스가 종료되면 오류가 발생했거나 (아마도 상태가 좋지 않음으로 인해) 오류가 발생했거나 중단되어 외부에서 강제 종료되거나 정상적으로 종료되어 상태가 필요하지 않음을 의미합니다. 아마도 잘못된 것이므로 나머지 프로세스를 감염시킬 수 있으므로 프로세스를 종료하는 과정에서 상태를 가져올 수 없습니다. – tkowal

+0

그러면 추락했다고 가정하면 자녀의 가치를 어떻게 회복 할 수 있습니까? 아이가 부모에게 값을 지속적으로 업데이트해야합니까? –

0

sys:get_state/1을 사용하면 아직 실행중인 프로세스의 상태에 액세스 할 수 있습니다. 프로세스가 자신의 상태에 포함 된 데이터와 관련하여 중요한 작업을 수행하는 경우 데이터는 디스크, 데이터베이스 또는 다른 프로세스 (메시지 대기열 일 수도 있음)에 저장되어야합니다. 이것은 아마도 건축상의 문제 일 것입니다. 개별 프로세스가 충돌하는 것을 계획해야하며 복구하기 위해 죽은 프로세스의 나머지 부분을 선택하지 않아도됩니다. 당신은 수퍼바이저에 대해 언급하지 않았고, 당신이 조사해야 할 부분 일 수도 있습니다. 수퍼바이저는 내결함성 및 동시 Erlang/OTP 어플리케이션의 핵심 부분입니다. 관리자 행동에 관한 문서는 다음에서 볼 수 있습니다. http://www.erlang.org/doc/man/supervisor.html

두 가지 질문에 대한 답변 : 관리자가 프로세스를 다시 시작한 다음 다시는 프로세스가 필요하지 않은 데이터/상태를 관리 할 수 ​​있도록 응용 프로그램을 다시 설계하는 것이 좋습니다. 잃어버린.

+0

'sys'는'gen_server'와 같은 적절한 OTP 프로세스에서만 작동합니다. 어떤 프로세스에서도 작동하지 않습니다. 예를 들어 console :'sys : get_state (self) '에서 이것을 시도하십시오. – tkowal

1

-> 아니요.이 프로세스가 종료되면 모든 항목이 erlang VM에 의해 치료됩니다.

동일한 이름의 자식을 다시 등록하는 방법은 무엇입니까? -> 예, 프로세스가 실제로 종료되면 프로세스 등록에 동일한 이름을 다시 사용하는 제약이 없습니다. 그것은 사실 일반적인 경우입니다.

어떻게 동일한 값으로 어린이를 다시 등록 할 수 있습니까? -> 짧은 대답이 아닙니다.

  • 먼저 당신이 (프로세스 외부) ETS 또는 mnesia 또는 외부 평균에 등록하는 경우에만이 프로세스의 상태를 얻을 수있을 것입니다 - 당신은
  • 경우, 또는 마지막으로 저장된 값을 얻을 것이다 당신의 프로세스는 다이 메시지를 포착하고 필요한 모든 정보를 "집에서 만든 감독자"에게 돌려 보낸다. 그것은 당신의 디자인에 복잡성을 초래할 것이고, 모든 죽음의 원인을 파악할 수있는 것은 아닙니다 (적어도 죽이는 메시지는 불가능합니다).
  • 마지막 : 이유는 무엇입니까? 그것은 당신이 당신의 어플리케이션의 데이터 모델에 대해 작업해야한다고 들린다. 애플리케이션에 속해 있고 프로세스 충돌 (고객 계정, 주문 ...)에 견뎌야하는 데이터가 있습니다. 대부분의 경우 응용 프로그램이 완전히 중지되거나 서버가 다운 될 때까지 살아남 아야합니다. 데이터베이스 (복제 포함)가이 작업을 수행합니다. 이 데이터는 프로세스 상태가 아닙니다. 프로세스 상태는 다른 끝에서 현재 살아있는 프로세스에 대해서만 의미가 있어야합니다. 소켓, 일부 참조, pid, 일부 시간 초과 일 수 있습니다. 초기화 매개 변수에서부터 복원을 시도하지 말고 모든 것을 다시 작성해야합니다. 이전 상태, 단순히 대부분의 시간이 쓸모 없기 때문이며, 또한 아마도이 데이터 중 하나가 충돌의 원인 일 수 있기 때문입니다. 이러한 구분은 부작용이없는 코드 (디버깅 및 검증이 훨씬 쉬워 짐)와 "충돌 시키십시오"라는 사용법을 고수하는 것이 중요합니다.
+0

왜? 우리 교수가 Erlang에서 실패를 다루기를 원하기 때문입니다. 그래서 나는 그 과정이 깨끗하게 죽기보다는 추락했다고 추정 할 수 있다고 생각합니다. Erlang을 사용하여 2048 게임을 구현해야합니다. Erlang에서는 4x4 격자의 모든 타일이 등록 된 프로세스입니다. 명령 (위, 아래, 왼쪽, 오른쪽)에 따라 해당 타일은 서로 통신하여 값을 업데이트해야하지만 타일을 임의로 닫을 수는 있습니다. 그래서 우리는 실패를 다루는 법을 배웁니다. 타일이 사라지지 않는 것처럼 현재 값으로 타일을 다시 생성해야합니다. –

+0

이 프레젠테이션을 확인하십시오 : http://www.slideshare.net/torbenhoffmann90/2014-12ndcthinking 또한 셀 기반의 삶의 게임을 디자인하는 방법을 알려줍니다. 실패를 다루는 것은 슬라이드 29에서부터 시작됩니다. 다소 복잡하지만 솔루션은 놀라 울 정도로 잘 확장됩니다. – tkowal

+0

@ tkowal 좋습니다. 감사합니다. 나는 그것을 조사 할 것이다. –

관련 문제