Erlang 基礎知識整理

Erlang 是面向併發的函數式語言,Erlang的特性有:
併發性,分佈式,健壯性,熱代碼升級等。
(其餘特性如 遞增式代碼裝載 軟實時性 目前還不太理解).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%git

Erlang 基礎總結:

1.1. Erlang數據類型有
integer(整形);Atom(原子);
float(浮點數)在Erlang中無需關心浮點數大小;
reference(引用):引用是全局惟一的符號,用來比較兩個引用是否相等;
引用能夠經過erlang:make_ref()來建立;
pid(進程標識符-process identifier):pid由spawn()建立,
是Erlang進程的引用數據庫

1.2. Erlang 對於二進制的數據處理提供了很是強大的語法
經常使用的操做二進制數據的函數:
list_to_binary(List)->binary().
split_binary()
term_to_binary(Term)
binary_to_term()編程

1.3. Erlang最重要的數據類型就是列表和元組
Erlang List 經常使用元組操做:
tuple_size(Tupel) % 元組中元素個數
element(Th, Tuple) % 獲取元組中第Th個元素
setelement(Th, Tuple, T) % 設置元組第Th個元素爲 F
erlang:append_element(Tuple, T) %元組結尾添加一個元素T
記錄:記錄是元組的假裝,它提供了一個方法,把一個名稱與元組中的一個元素對應起來;
記錄使用方法:首先定義記錄,並保存在一個.hrl文件中,Erlang程序引用該.hrl文件
就能夠定義和操縱記錄了。數組

1.4. Erlang List 列表經常使用操做:
map(Fun, List1) -> List2
foldl(Fun, Acc0, List) -> Acc1
merge(ListOfLists) -> List1
1.5. Erlang是沒有字符串
String(字符串),Erlang是沒有字符串的,
經過雙引號引發來的字符系列。這種寫法只不過是字符串裏的ascii碼組成的整數
列表,例如:字符串「cat」只是列表[97,99,116]的速記法。
1.6. 做爲函數式的語言 Erlang變量不能第二次賦值,這樣不用再去跟蹤某個變量的一系
列些列的變化,能夠經過模式匹配給變量賦值,以及從複合數據類型中提取值。
也能夠控制函數的執行,好比
area({rectangle, Width, Ht}) ->Width * Ht;
area({circle, R}) ->3.14 * R * R .
程序會從前到後用函數頭中的模式與調用參數匹配,若是匹配
成功,該子句對應的表達式就會被執行。服務器

斷言是一種用於強化模式匹配功能的
 結構,使用斷言能夠在一個模式上作一些簡單的變量測試和比較,
 好比:max(X, Y) when X > Y ->X;
 max(X, Y) ->Y.

1.7. 在Erlang中在Erlang中函數能夠給變量賦值,能夠做爲其餘函數作參數, 也能夠做爲其餘函數的返回值。
1.8. Erlang沒有循環,若是要實現循環只能經過遞歸來實現。
舉個循環例子:
for(Max, Max, F) -> [F(Max)].
for(I,Max,F) ->[F(I)|for(I+1,Max, F)].
尾遞歸
若是一個函數中全部遞歸形式的調用都出如今函數的末尾,咱們稱這個遞歸函數是尾遞歸的
由於模式匹配是自上而下的,因此遞歸的結束子句必定要寫在前面,尾遞歸的實現須要藉助輔
助變量,是對遞歸的"尾"調用的實現,結果都保存在形參中.cookie

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%併發

關於Erlang的併發

Erlang是面向併發的,每個Erlang中的併發活動成爲一個進程。Erlang併發
設計原則:
世界是併發的;事物之間不共享數據;事務經過消息進行通訊;事務會出現故障

2.1.進程啓動
spawn(Module, Fun, [Argulent]).
進程的發送和接收原語 !(send) , receive
2.2.經過register能夠給進程註冊一個標識符,以便於和其餘進程進行通訊
Erlang 進程註冊機制目前的限制是:
1:names只能是atom
2:一個進程只能註冊一個name
3:不能進行高效的搜索和遍歷,進程信息的檢索是經過遍歷檢查進程的元數據完成的.
Gproc是Erlang進程註冊機制的增強版,提供了以下原生進程註冊沒有的功能:
1:使用任意Erlang Term做爲進程的別名
2:一個進程註冊多個別名
****
gproc 能夠給一個進程註冊多個別名
屬性是不惟一的,能夠給多個進程註冊一樣的屬性名稱
gproc:reg()
gproc:send()
當gproc:send()第一個參數是已經註冊的屬性名稱時就能夠實現給多個進程發送消息、
實現羣發。
2.3.併發進程的錯誤處理:
link(Pid) 當前進程和Pid進程創建連接,這樣兩個進程相互監視,當一方消亡時,系統
會給另外一發發送退出信號,收到信號後,若是沒有對接收特殊處理,默認接收進程一併
退出,能夠用process_flag(trap_exit, true) 讓進程成爲系統進程,這樣接收到傳過來
的退出信號,就會作出一些處理而不退出。
2.3.1 若是本身建立的進程崩潰,本身也自行消亡,能夠用
spawn_link()建立進程
若是本身建立的進程崩潰,本身須要作一些處理,
process_flag(trap_exit, true),
spawn_link().
2.3.2 進程之間的處理還能夠用監控樹.
2.4.節點間通訊
只要分佈式Erlang節點共享相同的cookie信息,他們之間就能夠通訊,
鏈接在一塊兒的節點信息是共享的.
若是兩個節點是存活的(Erlang:is_alive()=:=true), 卻不能鏈接
(net_adm:ping/1=:=pang)
首先檢查cookie是否相同,接下來查看DNS是否可以解析,或者
主機名和IP是否在/etc/hosts文件中配置
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%app

erlnag/OTP gen_server

Erlang的OTP behaviour是對一些通用編程模式的抽象,在用Erlang 語言作開發時能夠在behavior基礎
上快速構建出可用且可靠的功能。
gen_server:start_link(Name, Mod, InitArgs, Opts),
負責啓動一切,它建立了一個名爲Name的服務器程序,主要負責發送和接收消息異步

爲了調用服務器程序,客戶端調用gen_server:call(Name, Request)
這會致使調用handle_call/3函數,它主要用來處理同步請求,須要給
客戶端發送返回結果。
gen_server:cast(Name, Request)
這會致使調用handle_cast/3函數,它主要用來處理異步請求,沒有返回值。 
handle_info/2這個方法的定位是處理同步請求,異步請求以外的消息,若是一個消息咱們能明確的
知道是call仍是cast就不要走這裏;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%分佈式

關於application

Erlang程序包含相互調用的函數,
函數組合在一塊兒並在模塊中定義,模塊是Erlang代碼的基本單元,一組功能模塊,
能夠打包成一個應用,做爲一個單獨的總體,一塊兒啓動,中止。
應用-->模塊-->函數-->語句-->子語句-->表達式.......

application是Erlang代碼和功能組織的形式之一.
application的設計目的是經過運行一個或者多個進程來完成必定功能.
爲了可以管理這些進程的生命週期,須要經過supervisor進行管理.

4.1.Application至少包括的三個部分爲:
(1)應用模塊:主要包括如何啓動和中止Application的函數start/2,stop/1;
(2)監控模塊:監控樹的代碼實現;
(3)資源文件:.app文件,包含應用程序的信息。
4.2.監控樹是由進程造成的一棵樹,樹頂端是監控進程,負責監控下方的進程,
下方的進程能夠是工做進程也能夠是其餘監控進程。
若是監控樹下方的進程崩潰了,監控進程負責按照 init/1 函數中的設置從新
啓動下方的進程。
Erlang 四種監控策略:
1.one_for_one:
若是一個子進程中止,則只重啓該子進程。
2.simple_one_for_one:
一個簡化的one_for_one,全部的子進程都是一樣的進程類型,而且是動
態添加的實例。
3.all_or_one:
若是任何一個子進程中止,全部其餘子進程也中止,而後重啓全部子進程
4.rest_for_one:
一個子進程中止,啓動順序在該子進程以後的其餘子進程也中止,而後這
些中止的進程重啓
4.3. 一個應用須要一個.app文件來描述,主要描述它包括哪些文件,參數等。
比較完整的資源文件以下:
{application,test, % 名稱
[{description,"Test application"}, % 描述
{vsn, "1.0.0"}, % 版本
{id, Id}, % id 同 erl -id ID
{modules, [test_app,test_sup]}, % 全部模塊,systools用來生成script/tar文件
{maxP, Num}, % 最大進程數
{maxT, Time}, % 運行時間 單位毫秒
{registered, [test_app]}, % 指定名稱,systools用來解決名字衝突
{included_applictions, []}, % 指定子app,加載但不啓動
{mod, {test_app,[]}}, % 啓動模塊,[]爲參數
{env, []}, % 配置env,可使用application:get_env獲取
{applications,[kernel,stdlib]}]}. % 依賴項,啓動app前,將會首先啓動的app

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ets和dets是Erlang用於高效存儲大量Erlang數據條目的兩個

系統模塊,他們提供大量的"鍵-值"搜索表,
1.ETS是內存存儲,速度快
2.DETS是磁盤存儲,可備份
3.建立表:ets:new
dets:open_file
4.插入:insert(table, X)
5.查找:lookup(table, Key)
6.釋放:dets:close(tableid)
etd:delete(tableid)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Erlang 程序的編譯 和 運行

  1. rebar.config
    deps 定義依賴文件

  2. rebar 經常使用命令
    clean 去掉全部生成的文件
    compile 編譯源文件
    delete-deps 刪除rebar.config設置的依賴庫源文件
    get-deps 檢索獲取rebar.config 設置的依賴庫源文件
    當deps有更新的時候,能夠用到這兩個
    generate 生成目標文件

  3. 在命令行下運行程序:參數解釋
    -name 啓動一個節點;
    -config 指定配置文件;
    -env 設置環境變量;

    關於環境變量:
    若是環境變量在.app文件中設置,同時在-config指定的文件中設置,則
    -config指定的文件中的會覆蓋.app文件中的變量值,若是在命令行下
    -env設置環境變量,在-config指定的文件中已經設置過,則命令行下設置的
    會覆蓋-config指定的文件中設置的變量值

    -pa 設置須要啓動的編譯過的模塊的路徑;
    -s 執行特定函數,默認是start/0;

4.Erlang 常見的錯誤類型
badarg 參數錯誤,參數格式或類型錯誤
badarith 算術表達式錯誤,算術表達式中含有錯誤的參數
{badmatch,V} 模式匹配錯誤,V指具體的發生匹配錯誤的數值
function_clause 函數子句錯誤,沒有找到匹配的函數子句
{case_clause,V} case匹配錯誤,沒有找到匹配的case pattern
if_clause if子句錯誤,沒有找到爲ture的if子句
{try_clause,V} try匹配錯誤,執行try時,沒有找到匹配的pattern
undef 函數未定義錯誤
{badfun,F} 函數錯誤
{badarity,F} 函數參數個數錯誤
timeout_value 超時參數錯誤,在receive.. after語法中,after對應的超時數據
錯誤(應爲不小於0的integer或infinity
noproc Process 錯誤,Process不存在
{nocatch,V} throw未被catch
system_limit 系統限制錯誤,某些性能或數據達到系統極限
undef是碰見的作多的錯誤類型,
若是調用一個eralng函數時發生undef錯誤,多是如下幾種緣由:
(1)系統中不存在這個模塊或函數,多是拼寫錯誤。
(2)系統中有這個模塊,但沒有編譯。
(3)已經編譯了,但它所在的目錄不在erlang的加載路徑中。
(4)加載了幾個不一樣版本,咱們能夠經過code:clash()函數來看一下是否有重名的模塊。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

關於版本控制:

(1)
git 一個分佈式的版本控制系統
經常使用的git 命令有
(1)首先獲取要編輯文件的最新版本
git pull
(2)而後開始編輯文件
(3)提交編輯好的文件
git add 文件名
git commit -m 「備註」
(4)把提交過的文件推送到遠程
git push origin master

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
在命令行下運行程序:
文件理解:
-name 啓動一個節點;
-config 指定配置文件;
-env 設置環境變量;
-pa 設置須要啓動的編譯過的模塊的路徑;
-s 執行特定函數,默認是start/0;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  1. rebar.config
    deps 定義依賴文件

rebar 經常使用命令
clean 去掉全部生成的文件
compile 編譯源文件
delete-deps 刪除rebar.config設置的依賴庫源文件
get-deps 檢索獲取rebar.config 設置的依賴庫源文件
當deps有更新的時候,能夠用到這兩個
generate 生成目標文件
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
關於環境變量:

在命令行下-env 設置的環境變量若是在。config文件中設置過,

badarg 參數錯誤,參數格式或類型錯誤
badarith 算術表達式錯誤,算術表達式中含有錯誤的參數
{badmatch,V} 模式匹配錯誤,V指具體的發生匹配錯誤的數值
function_clause 函數子句錯誤,沒有找到匹配的函數子句
{case_clause,V} case匹配錯誤,沒有找到匹配的case pattern
if_clause if子句錯誤,沒有找到爲ture的if子句
{try_clause,V} try匹配錯誤,執行try時,沒有找到匹配的pattern
undef 函數未定義錯誤
{badfun,F} 函數錯誤
{badarity,F} 函數參數個數錯誤
timeout_value 超時參數錯誤,在receive.. after語法中,after對應的超時數據錯誤(應爲不小於0的integer或infinity
noproc Process 錯誤,Process不存在
{nocatch,V} throw未被catch
system_limit 系統限制錯誤,某些性能或數據達到系統極限

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

screen的應用、
screen -x
screen -ls

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ets
Erlang語法:數據庫
--------------------------------------
1.ETS是內存存儲,速度快
2.DETS是磁盤存儲,可備份
3.建立表:ets:new
dets:open_file
4.插入:insert(table, X)
5.查找:lookup(table, Key)
6.釋放:dets:close(tableid) etd:delete(tableid)
7.Mnesia數據庫:
建立表:-record...
選取全部數據:do(qlc())...
選取部分列:
按條件選取:
關連查詢:
增長數據:mnesia:write()
刪除數據:mnesia:delete()
事務管理:mnesia:transaction(F)
取消事務:mnesia:abort()
啓動表查看器:tv:start().

字符串列表轉爲字符串的方法:

L1 = ["a","b","c","d"], binary_to_list(list_to_binary(L1)). "abcd"

相關文章
相關標籤/搜索