문제

나는 최근에 Joe의 책을 완성하고 그것을 즐겼습니다. 그 이후로 Erlang과 함께 소프트 실시간 응용 프로그램을 코딩하기 시작했으며 Gen_Server의 사용에 약간 혼란스러워한다고 말해야합니다.

간단한 무국적 모듈 대신 Gen_Server를 언제 사용해야합니까? 스테이션리스 모듈을 다음으로 정의합니다 .- 내부적으로 (gen_server)를 유지하는 것과는 반대로 상태를 매개 변수 (ETS/DETS와 매우 유사)로 취하는 모듈입니다.

송장 관리자 유형 모듈에 대해 말하면, 초기화 및 반환 상태를 반환 해야하는 다음 이후에 전달해야합니까? somestate = invoicemanager : init (), somestate = invoicemanager : addinvoice (somestate, aninvoicefoo).

송장 관리자 상태의 여러 인스턴스가 필요하다고 가정합니다 (내 응용 프로그램은 각각 자체 송장으로 여러 회사를 관리합니다). 위에?

둘 사이의 선은 어디에 있습니까?

(위의 송장 관리 예제는 단지 내 질문을 설명하는 예입니다)

도움이 되었습니까?

해결책

그것은 당신의 요구와 응용 프로그램 설계에 크게 의존합니다. 프로세스간에 공유 상태가 필요한 경우이 상태를 유지하려면 프로세스를 사용해야합니다. 그 다음에 gen_server, gen_fsm 또는 기타 gen_* 당신의 친구입니다. 애플리케이션이 동시에 있지 않거나이 디자인이 다른 이점을 가져 오지 않으면이 디자인을 피할 수 있습니다. 예를 들어, 응용 프로그램을 프로세스로 나누면 더 간단한 디자인이됩니다. 다른 경우에는 때때로 단일 프로세스 설계를 선택하고 성능 또는 그와 같은 "상태 부족"모듈을 사용할 수 있습니다. "SANTELESS"모듈은 매우 간단한 상태의 (순수한 기능) 작업에 가장 적합한 선택입니다. gen_server 자연스럽게 "프로세스"인 것처럼 보이는 생각에 종종 최상의 선택입니다. 프로세스간에 무언가를 공유 할 때 사용해야합니다 (프로세스 사용은 확장 성 또는 동시성으로 제한 될 수 있음).

다른 팁

나는 당신이 당신이 당신이 무국적 모듈이라고 부르는 것과 gen_server를 구별 할 수 있다고 생각하지 않습니다. 두 경우 모두 적어도 하나의 인수로 상태를 전달하는 재귀 수신 루프가 있습니다. 이 기본 루프는 요청을 처리하고 요청에 따라 작동하며 필요한 경우 요청자를 다시 보냅니다. 기본 루프는 주요 API/프로토콜의 일부가 아닐 수도있는 여러 관리 요청을 처리 할 가능성이 높습니다.

차이점은 gen_server가 메인 수신 루프를 추상화하고 사용자가 실제 쓸만 할 수 있다는 것입니다. 사용자 코드. 또한 많은 관리 OTP 기능을 처리합니다. 주요 차이점은 사용자 코드 다른 모듈에 있습니다 보다 상태를 통과하여 더 쉽게 통과했습니다. 실제로 하나의 큰 수신 루프로 코드를 작성하지 않고 다른 기능을 호출하여 작업을 수행하지 않는 한 실제 차이는 없습니다.

어떤 방법이 더 나은지에 필요한 것에 크게 의존합니다. gen_server를 사용하면 코드를 단순화하고 "무료로"추가 기능을 제공하지만 더 제한적 일 수 있습니다. 자신을 굴리면 더 많은 힘을 줄 수 있지만 더 많은 가능성을 줄 수 있습니다. 아마도 조금 더 빠릅니다. 뭐가 필요하세요?

두 모델을 모두 사용한 후 제공된 gen_server를 사용하면 더 쉽게 구조화 할 수 있다고 말해야합니다. 이것이 이것이 도구의 OTP 스택에 포함 된 이유라고 생각합니다. Gen_Server는 반복적 인 보일러 플레이트를 벗어나는 좋은 방법입니다.

여러 프로세스를 통해 상태를 공유 한 경우 Gen_Server와 함께 가야하며 상태가 하나의 프로세스에 단 한 프로세스 인 경우 무국적 모듈이 제대로 작동합니다.

나는 당신의 송장 (또는 그들이 참조하는 것)이 지속적이어야한다고 생각합니다. 그래서 그들은 어쨌든 ETS/MNESIA 테이블에서 끝날 것입니다. 그렇다면 송장 테이블에 액세스하기 위해 API를 넣는 무국적 모듈을 만들어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top