2016-07-12 8 views

답변

9

두 함수는 호출 프로세스의 자식으로 새로운 gen_server 인스턴스를 시작,하지만 그들은에서 다릅니다 gen_server:start_link/3,4이 원자 적으로 시작하는 gen_server 아동과 그 부모를 링크 그것은 과정. 연결한다는 것은 아이가 죽으면 부모가 기본적으로 죽을 것임을 의미합니다. Supervisors은 자식 프로세스가 비정상적으로 종료 할 때 링크를 사용하여 특정 작업을 수행하는 부모 프로세스로, 일반적으로 다시 시작합니다.

케이스에 포함 된 링크 외에도 이러한 호출과 관련된 다중 프로세스 측면은 없습니다. gen_server:start 또는 gen_server:start_link을 사용하여 새 gen_server을 시작하든 관계없이 새 프로세스에는 단일 메시지 큐가 있으며 한 번에 하나씩 메시지를 수신하여 처리합니다. 새 gen_server 프로세스가 gen_server:start으로 시작하는 경우와 다르게 동작하거나 수행하게하는 원인은 gen_server:start_link에 관한 것입니다.

+0

스티브 편집을 참조하십시오. –

+1

귀하의 편집 내용에 이미 답변했습니다. 여러 프로세스가'gen_server'를 동시에 호출하면, 그들의 메시지는'gen_server' 메시지 대기열에 대기하고'gen_server'는 한 번에 하나씩 그 메시지를 처리합니다. –

4

gen_server:start_link을 사용하면 새로운 프로세스가 호출 프로세스의 "자식"이됩니다 - 감독 트리의 일부입니다. gen_server 프로세스가 종료되면 호출 프로세스에 알릴 수 있습니다.

gen_server:start을 사용하면 감독 트리 외부에서 프로세스가 생성됩니다.

얼랑에 감독의 좋은 설명은 여기에 있습니다 : http://learnyousomeerlang.com/supervisors

+0

genserver가 여러 스레드에서 호출되는 경우 한꺼번에 실행합니까? 또는 스레드간에 동시성을 생성합니까? –

+0

답변을 주셔서 감사합니다. 저에게도 답변 해 주시겠습니까? –

+4

Erlang은 "스레드"라는 용어를 사용하지 않습니다. 그것은 "프로세스"라고 불립니다. 여러 프로세스가 동일한 gen_server를 호출하면 요청이 대기열에 넣어지고 차례대로 처리됩니다. http://learnyousomeerlang.com/content에서 OTP에 관한 아주 좋은 부분이 있습니다 – Novakov