Posted on April 23, 2009 by ytshen
在Erlang User Conference 2006上, 看到一篇關於Erlang message passing的slide, 覺得蠻有趣的
Ref: http://www.duomark.com/erlang/briefings/euc2006/index.html
這篇slide分成3個部份
第1部份是講基本語法
第2部份就是我比較感興趣的地方, 他提到一個有趣的問題
問題描述:
在利用Erlang接受message的時候, 如果有一種priority message, 只要一接收到這種message, 就要先執行相對應的工作, 但是在Erlang的message model中, 他有一個message queue, 所有的message都會被丟到這個queue裡面, 照順序接收,他並不保證有某些message接收的順序是比較高的, 所以我們應該要怎麼解決這個問題?
解法:
其實這個問題並不是很好解決, 他先提出兩種polling的方法, 但是都不是很好, 而且一個process當中最好不要有兩個以上的receive message statement, 可能會有memory performance的問題, 所以他給出利用protocol溝通的方式:
分成router, high process, low process and data store 4個process, 簡單來說router會控制現在是要讓high process還是讓low process去access data store, 所以利用protocol來判斷兩個process當中的message queue, 一旦high process有要處理的message, 就擋掉low process!
第3部份:
介紹一種(event programming) pattern, 來避免利用一大堆State machine來實作(以後更改太困難…).
Description:
central event loop [...]
Filed under: programming | Tagged: erlang | Leave a Comment »
Posted on April 3, 2009 by ytshen
上次大概介紹了Erlang這個語言的特性, 這次我想稍微介紹一下OTP的設計概念或者說我們應該要怎麼用Erlang來設計network service。(需要稍微了解Erlang 語法), (p.s 本篇code跟圖出處都是Joe的論文)
Erlang的OTP設計上,他是把關於concurrent programming隱藏起來,讓使用者只需要專注於sequencial programming的部分,現在我們來看它是怎麼實作的。
OTP也是使用client-server的架構, 所謂client-server就是指以下這張圖
最基本的generic server code如下:
-module(server1).
-export([start/3, stop/1, rpc/2]).
start(Name, F, State) –>
% register and create a process which name is Name
% and tell the server to use the handler function F
register(Name, spawn(fun() ->
loop(Name, F, State)
[...]
Filed under: programming | Tagged: erlang | Leave a Comment »
Posted on March 31, 2009 by ytshen
最近在學習Erlang,發現Erlang其實是一個蠻簡單容易理解的語言,而且針對特定的問題(concurrent progarmming, 分散式系統, 網路service),寫起來很快。尤其現在multi-core的CPU,在Functional language的model下(No share memory),應該更能好好運用其多核心的運算能力,Erlang 應該可以算是目前Functional Language在工業上面蠻常運用到的(尤其在電信業),他一開始是從Ericsson裡面的CSLab所開發出來的,後來就open source出來,他最強大的是一套可以稱為Framework or Library的工具OTP(Open Telecom Platform),因為它主要是focus on server,他把一些設計concurrent program的概念隱藏在裡面,所以你直接套用這套工具的話,可以省不少事。
Erlang是跑在他自己的Virtual machine上面,具有一些特性:
runtime update
pure message passing
light weight process
fault tolerant
runtime update:
Erlang的Virtual Machine讓你可以在程式執行的時候,去修改程式碼後,他會dynamic load進新的程式碼,讓你不必把程式關掉在執行
light weight process:
Erlang不像是其他程式語言,它直接把process的概念放進語法裡面,在Erlang的設計概念中,他希望所有的事物都是透過你把事情切割分別讓process去操作,而且Erlang創造一個process的overload不是很大
pure message passing:
在Erlang當中,既然可以自由的創造process,那這些process之間要怎麼溝通呢?他不像是傳統寫C, C++這類sequential程式一樣是利用lock/unlock等synchronize技巧,他純粹就是你直接可以Send message給別的process,其他process只要等著receice message就可以了,這有個好處,就是沒有share variable等因素可能會造成race condition or dead lock,而且Erlang並沒有限制process只能在local,你可以自由的send message到遠端的node,這正好發揮了distribute system的強處
fault tolerant:
因為Erlang一開始就用途就是為了電信業上面的switch,在電信業本身它希望程式能夠再發生error的時候,能夠自動correct error或是restart,所以在Erlang的設計概念中,他希望process如果發生處理不了的問題,就讓process自動被kill,跟這個process有相關的process會收到通知說,有process被kill,在根據原因來做一些適當的處理
待續
在part 2中,我準備稍微介紹一下OTP裡面關於實作server的pattern
Filed under: programming | Tagged: erlang | Leave a Comment »
Posted on March 17, 2009 by ytshen
最近看到某個library的function居然呼叫的時候,強制必須傳list comprehension,讓我很shock, 居然erlang可以這樣檢查type?!
Ex:
version 1: (ok)
qlc([X || X <- Table])
version 2: (error)
Val = [X || X <- Table ]
qlc(Val)
結果實際trace erlang的source code 加上 IRC上面的人解答
原來erlang可以用類似pre-process的方式, 在parse的時候就判斷參數的正確性
這雖然不是什麼新概念, 但是你可以寫parser的plug-in, 這感覺就很不一樣!
p.s IRC上的人果然都是好人~ 有問題都可以問問~~
Reference:
http://www.erlang.org/documentation/doc-5.4.8/lib/stdlib-1.13.8/doc/html/qlc.html
Filed under: programming | Tagged: erlang | Leave a Comment »