An object oriented language is a language with good support for objects.
A concurrency oriented language has good support for concurrency.
--Joe Armstrong
兩類通用併發模型:參考七週七併發模型git
共享內存型Shared Memory程序員
消息傳送型(CSP和Actor模型)github
重點介紹消息傳送型的兩種模型Actor和CSP(Communicating Sequential Process)的各項對比shell
主要目的:除了經常使用的Python、Java等用的併發模型以外,還存在這麼個東西數據庫
先看兩段代碼緩存
使用Erlang代碼和Go代碼分別實現打印服務print_server,用來對比模型使用差別併發
Actor模型-Erlang代碼異步
%%%------------------------------------------------------------------- %%% @author Suncle %%% @doc %%% print_server %%% @end %%% Created : 2017/12/18 14:53 %%%------------------------------------------------------------------- -module(print_server). -author("Flowsnow"). %% API -export([print_server/0, start_print_server/0, send_msg/2]). print_server() -> receive Msg -> io:format("print_server received msg: ~p~n", [Msg]), print_server() end. start_print_server() -> Pid = spawn(?MODULE, print_server, []), Pid. send_msg(Msg, Pid) -> Pid ! Msg, io:format("send_normal_msg: ~p~n", [Msg]).
Erlang shell輸出結果以下:ide
1> c("print_server.erl"). {ok,print_server} 2> Pid = print_server:start_print_server(). <0.39.0> 3> print_server:send_msg("hello", Pid). send_normal_msg: "hello" print_server received msg: "hello" ok
以上print_server使用的是最原始的Erlang語法實現的,也能夠使用OTP gen_server原語實現更加清晰易懂函數
CSP模型-Go代碼
print函數從channel讀取消息並阻塞,直到主函數向channel寫入hello消息
package main import ( "fmt" "time" ) func main() { c := make(chan string) go print(c) time.Sleep(1 * time.Second) fmt.Println("main function: start writing msg") c <- "hello" var input string fmt.Scanln(&input) } func print(c <-chan string) { fmt.Println("print function: start reading") fmt.Println("print function: reading: " + <-c) time.Sleep(1 * time.Second) }
輸出結果以下:
D:\workspace\Go>go run print_server.go print function: start reading main function: start writing msg print function: reading: hello
Actor
Actor1發送消息到Actor2的郵箱中,郵箱本質是隊列,由Actor2消費
CSP
Process1在Channel的寫入端添加消息,Process2在channel的讀取端讀取消息
Actor
CSP
Actor
Actor1等待消息並阻塞,直到Actor2發送消息給Actor1
Actor2發送消息給Actor3,暫存在Actor3的Mailbox中,直到Actor3接受並處理
CSP
Process1讀取channel因沒有消息阻塞,直到Process2向該channel添加消息
process2向channel添加消息並阻塞,直到Process3讀取該channel消息
使用Erlang原語,代碼以下:
使用OTP的gen_server,代碼以下:
使用Erlang/OTP實現的IP數據庫,能夠根據IP查詢到具體的國家省份等,代碼以下:
好比:執行算術異常崩潰
爲何沒有容量自動增大的緩衝區?
即便如今有一個看上去永不枯竭的資源,總有一天這個資源仍是會被用盡的。多是由於時過境遷,當初的老程序如今須要解決更大規模的問題;也多是存在一個bug,消息沒有被及時處理,致使被堆積。若是沒有思考緩衝區塞滿時的對策,那麼在將來的某個時間就有可能出現一個破壞性極強,隱蔽性極深且難以診斷的bug。最好的策略是在如今就思考如何處理緩存區被塞滿的狀況,將問題消滅在萌芽階段。
所以經常使用的緩存區類型有三種:阻塞型(blocking),棄用新值型(dropping),移出舊值型(sliding)
Python有什麼消息傳遞併發模型?
Actor模型pykka:https://github.com/jodal/pykka
CSP模型pycsp:https://github.com/runefriborg/pycsp/wiki/Getting_Started_With_PyCSP
圖片均來源於here!
參考:
記得幫我點贊哦!
精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你須要的學習資料,還在等什麼?快去關注下載吧!!!
念念不忘,必有迴響,小夥伴們幫我點個贊吧,很是感謝。
我是職場亮哥,YY高級軟件工程師、四年工做經驗,拒絕鹹魚爭當龍頭的斜槓程序員。
聽我說,進步多,程序人生一把梭
若是有幸能幫到你,請幫我點個【贊】,給個關注,若是能順帶評論給個鼓勵,將不勝感激。
職場亮哥文章列表:更多文章
本人全部文章、回答都與版權保護平臺有合做,著做權歸職場亮哥全部,未經受權,轉載必究!