OTP 서버

4982 단어
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

좋은 웹페이지 즐겨찾기