OTP 서버
defmodule Sequence.Server do
use GenServer
def handle_call( :next_number, _from, current_number) do
{ :reply, current_number, current_number + 1} #reply OTP
end
end
use 효과는 OTP GenServer 비헤이비어를 현재 모듈에 추가합니다.이렇게 하면 그것은 모든 리셋 함수를 처리할 수 있다.이것은 모듈에서 모든 리셋 함수를 정의할 필요가 없다는 것을 의미한다. 이 행위는 모든 기본 리셋 함수를 정의한다.
클라이언트가 서버를 호출할 때 GenServer가 다음 hand_call 함수.클라이언트가 호출한 정보를 전달합니다.2. 클라이언트의 PID.3. 서버 상태.
OTP {:reply,current_number,current_number + 1}에 메타그룹을 되돌려줍니다. 리플리는 OTP에 클라이언트를 되돌려야 한다고 알려줍니다. 두 번째는 되돌려주는 값이고, 세 번째는 새로운 상태를 정의합니다.이 상태는handle_call이 다음에 호출될 때 마지막 매개 변수로 전송됩니다.
서버를 시작하려면:
iex -S mix
{ :ok, pid } = GenServer.start_link(Sequence.Server, 100) #100 , 。
GenServer.call( pid, :next_number ) # 100
GenServer.call( pid, :next_number ) # 101
start_link 함수의 동작은spawnnu와 유사합니다link.이것은 GenServer에 새 프로세스를 만들고 우리와 연결하며 상태 값을 전달해야 합니다.서버의pid 되돌리기
call pid 프로세스의handle_ 호출call 함수, 두 번째 매개 변수(:next_number)와handle_call의 첫 번째 매개 변수가 일치합니다.handle_call의 첫 번째 매개 변수도 원조일 수 있습니다.
def handle_call({ :set_number, new_number}, _form, _current_number ) do
{:reply, new_number, new_number }
end
GenServer.call(pid, {:set_number, 999} ) # 999
cast
cast 함수는 서버를 호출하지만 응답을 기다리지 않습니다.cast를 handle_에게 보내기cast, 해당되지 않을 수 있으므로handle_cast는 두 개의 매개 변수만 필요합니다.두 번째 클라이언트pid를 대표하는 매개 변수를 포기했습니다.해당 반환 메타그룹은 {:noreply, new_state}입니다.
defmodule Sequence.Server do
use GenServer
def handle_call( :next_number, _from, current_number) do
{ :reply, current_number, current_number + 1}
end
def handle_cast({:increment_number, delta}, current_number) do
{ :noreply, current_number + delta}
end
end
GenServer.call(pid, :next_number) #100
GenServer.call(pid, :next_number) #101
GenServer.cast(pid, {:increment_number, 200}) # :ok
GenServer.call(pid, :next_number) #302
리셋 함수
init(start_arguments).GenServer가 서버를 시작할 때 호출되며 기본적으로 서버 상태를 출입 매개 변수의 값으로 설정합니다.
handle_call(request, from, state).클라이언트는 GenServer를 사용합니다.call (pid,request) 시 호출됩니다.성공적으로 반환됨 {:reply,result,new_state}
handle_cast(request, state).GenServer에 응답하는 데 사용됩니다.cast(pid, request).성공한 것은 {:noreply, new_state}이며, {:stop,reason,new_state}로 되돌아갈 수도 있습니다.
handle_info(info, state).콜과cast 이외의 메시지를 처리하는 데 사용됩니다.
terminate(reason, state).서버가 종료될 때 이 함수는 호출됩니다.
code_change(from_version, state, extra).OTP가 전체 시스템을 중지하지 않고 실행 중인 서버를 교체해야 하는 이유입니다.
format_status(reason, [pdict, state]).사용자 정의 서버의 상태 표시입니다.
프로세스에 이름 지정
서버를 시작할 때name: 파라미터를 추가합니다.
{ :ok, pid } = GenServer.start_link(Sequence.Server, 100, name::seq)
GenServer.call(:seq, :next_number)
인터페이스 정리
defmodule Sequence do
use GenServer
def start_link(current_number) do
GenServer.start_link(__MODULE__, current_number, name: __MODULE__)
end
def next_number do
GenServer.call __MODULE__, next_number
end
def increment_number(delta) do
GenServer.call __MODULE__, {:increment_number, delta}
end
def handle_call( :next_number, _from, current_number) do
{ :reply, current_number, current_number + 1}
end
def handle_cast({:increment_number, delta}, current_number) do
{ :noreply, current_number + delta}
end
end
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.