OTP服務器

defmodule Sequence.Server douse GenServerdef handle_call( :next_number, _from, current_number) do{ :reply, current_number, current_number + 1}  #reply告訴OTP將第二個元素返回給客戶端end
end

  use的效果將OTP GenServer的行為添加到當前模塊。這樣它就可以處理所有的回調函數。這也意味著我們不需要在模塊中定義所有的回調函數——該行為定義了所有默認的回調函數。

  當客戶端調用服務器時,GenServer調用接下來的hand_call函數。它接受:1、客戶端傳遞給調用的信息。2、客戶端的PID。3、服務器狀態。    

  其返回一個元組給OTP { :reply, current_number, current_number + 1 },reply告訴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函數的行為類似于spawn_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 douse GenServerdef handle_call( :next_number, _from, current_number) do{ :reply, current_number, current_number + 1}enddef handle_cast({:increment_number, delta}, current_number) do{ :noreply, current_number + delta}end
endGenServer.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)。用于處理call和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 douse GenServerdef start_link(current_number) doGenServer.start_link(__MODULE__, current_number, name: __MODULE__)enddef next_number doGenServer.call __MODULE__, next_numberenddef increment_number(delta) doGenServer.call __MODULE__, {:increment_number, delta}enddef handle_call( :next_number, _from, current_number) do{ :reply, current_number, current_number + 1}enddef handle_cast({:increment_number, delta}, current_number) do{ :noreply, current_number + delta}end
end

?

轉載于:https://www.cnblogs.com/lr1402585172/p/11512363.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384197.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384197.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384197.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

洛谷P1040-加分二叉樹-dp+二叉樹

P1040-加分二叉樹 這道題放在深度優先搜索的訓練題中,可是我實在沒有看出來應該怎么搜索。看了題解以后才看出來是一個很簡單的dp(我果然還是太菜了) 看出dp并且算出來最大的分數不是很復雜,關鍵是輸出給定中序遍歷序列的二叉樹的先序遍歷,要…

UNIX網絡編程:I/O復用技術(select、poll、epoll)

http://blog.csdn.net/dandelion_gong/article/details/51673085 Unix下可用的I/O模型一共有五種:阻塞I/O 、非阻塞I/O 、I/O復用 、信號驅動I/O 、異步I/O。此處我們主要介紹第三種I/O符復用。 I/O復用的功能:如果一個或多個I/O條件滿足(輸…

解決iex -S mix報錯

執行iex -S mix命令的時候會遇到如下錯誤: 執行 mix deps.get 然后就可以運行 iex -S mix了 其中,有可能會出現 按照其網站下載相應文件,復制到項目根目錄下,然后執行命令(mix local.rebar rebar ./rebar)即…

貪心算法——選擇不相交區間問題

題目描述&#xff1a;設有n個活動的集合&#xff0c;其中每個活動都要求使用同一個資源&#xff0c;而在同一時間內只有一個活動能夠使用這一資源&#xff0c;每個活動i都有一個要求使用該資源的起始時間si和一個結束時間fi(si<fi)&#xff0c;如果選擇了活動i&#xff0c;則…

Anker—工作學習筆記

http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html 1、基本知識 epoll是在2.6內核中提出的&#xff0c;是之前的select和poll的增強版本。相對于select和poll來說&#xff0c;epoll更加靈活&#xff0c;沒有描述符限制。epoll使用一個文件描述符管理多個描述符&am…

Supervisor監控

可參考&#xff1a;https://www.cnblogs.com/wang_yb/archive/2016/06/08/5564459.html &#xff1a;https://segmentfault.com/a/1190000007379204 轉載于:https://www.cnblogs.com/lr1402585172/p/11551488.html

深度搜索剪枝——數的劃分

【題目描述】將整數n分成k份&#xff0c;且每份不能為空&#xff0c;問有多少種分法&#xff1f; 【輸入格式】兩個整數n,m(6<n<200,2<m<6) 【輸出格式】輸出不同的分法數 【樣例輸入】7 3 【樣例輸出】4 對于這種搜索題&#xff0c;關鍵就在于剪枝&#xff1a;確定…

Linux網絡編程——tcp并發服務器(I/O復用之select

http://blog.csdn.net/lianghe_work/article/details/46519633 與多線程、多進程相比&#xff0c;I/O復用最大的優勢是系統開銷小&#xff0c;系統不需要建立新的進程或者線程&#xff0c;也不必維護這些線程和進程。 代碼示例&#xff1a; [csharp] view plaincopy #include &…

ets

:ets.new(table_name, pattern) 第一個參數是表名&#xff0c;第二個參數是表的設置選項。 :set  一個key&#xff0c;一個數據&#xff0c;無序 :ordered_set  一個key&#xff0c;一個數據&#xff0c;有序&#xff1b; 1 1.0 :bag  一個key&#xff0c;多個數據&…

貪心算法-區間選點問題-種樹

【題目描述】一條街道的一邊有幾座房子。因為環保原因居民想要在路邊種些樹&#xff0c;路邊的地區被分割成n塊&#xff0c;并被編號為1~n。每塊大小為一個單位尺寸且最多可總一棵樹。每個居民想在門前種些樹并制定了三個數b,e,t&#xff0c;這三個數代表居民想在b和e之間最少種…

ets注意事項

當表類型為 :set 時&#xff0c;使用 :ets.first 和 :ets.last 會獲取到同一個 key。將表類型換為 :oedered_set 就可以避免這種情況 轉載于:https://www.cnblogs.com/lr1402585172/p/11599219.html

CodeForces - 1141CPolycarp Restores Permutation搜索+剪枝

Polycarp Restores Permutation 【題意分析】題意大概是給定一個串&#xff0c;包含從1到n所有的數字。但是給定的是相鄰數字的差&#xff0c;需要復原這個串。 大概分析以后發現給定的是一個差分數組&#xff0c;所以只需要枚舉第一個元素就可以確定所有元素的值。 問題是如何…

CodeForces - 1141ESuperhero Battle簡單模擬

Superhero Battle 這道題卡了我一個多小時&#xff0c;最后也沒有做出來&#xff0c;成功稱為吊車尾。。。 思路什么的都沒有問題&#xff0c;主要是&#xff0c;爆long long了&#xff0c;這個太可怕了&#xff0c;就因為一個中間變量忘記開longlong導致一直一直wa&#xff0c…

Linux下的I/O復用與epoll詳解

http://www.cnblogs.com/lojunren/p/3856290.html 前言 I/O多路復用有很多種實現。在linux上&#xff0c;2.4內核前主要是select和poll&#xff0c;自Linux 2.6內核正式引入epoll以來&#xff0c;epoll已經成為了目前實現高性能網絡服務器的必備技術。盡管他們的使用方法不盡相…

校門外的樹——樹狀數組+區間修改

校門外的樹 【題目分析】題目描述的是一種區間修改&#xff0c;看起來好像要用線段樹。但是對于這種區間內部沒有差別并且查詢的是區間內的類別的問題&#xff0c;是可以轉化為樹狀數組進行的。畢竟樹狀數組更加簡單。 我們的關注點應該放在區間的端點處&#xff0c;然后通過統…

數據結構--順序棧和鏈式棧

http://www.cnblogs.com/jingliming/p/4602458.html 棧是一種限定只在表尾進行插入或刪除操作,棧也是線性表表頭稱為棧的底部,表尾稱為棧的頂部,表為空稱為空棧&#xff0c;棧又稱為后進先出的線性表,棧也有兩種表示:順序棧與鏈式棧順序棧是利用一組地址連續的存儲單元&#xf…

CodeForces - 1144F搜索+簡單圖論

【題目鏈接】Graph Without Long Directed Paths 【題目分析】題目想要講一個無向圖變成一個最長路徑不超過1的有向圖。假如某個邊是從u到v的&#xff0c;那么所有和v相連的都必須是指向v的&#xff0c;所有和u相連的都必須是從u開始的。相當于涂色&#xff0c;相連的節點應該涂…

數據結構--雙鏈表的創建和操作

http://www.cnblogs.com/jingliming/p/4602144.html#0-tsina-1-42616-397232819ff9a47a7b7e80a40613cfe1 一、雙向鏈表的定義 雙向鏈表也叫雙鏈表&#xff0c;是鏈表的一種&#xff0c;它的每個數據結點中都有兩個指針&#xff0c;分別指向直接后繼和直接前驅。所以&#xff0c…

CodeForces - 1152B二進制+思維

【題目鏈接】Neko Performs Cat Furrier Transform 【題目分析】要求將一個數字變成2n-1,通過嘗試我們發現如果將最低位的全零位和對應的全一數字&#xff08;例如11000對應的就是111&#xff09;異或那么數字就會變成想要的結果&#xff08;11111&#xff09; 但是如果前面還有…

C語言文件操作之fgets()

http://blog.csdn.net/daiyutage/article/details/8540932 來說一說fgets(..)函數。 原型 char * fgets(char * s, int n,FILE *stream); 參數&#xff1a; s: 字符型指針&#xff0c;指向存儲讀入數據的緩沖區的地址。 n: 從流中讀入n-1個字符 stream &#xff1a; 指向讀取…