青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Fork me on GitHub
隨筆 - 215  文章 - 13  trackbacks - 0
<2017年1月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234


專注即時通訊及網游服務端編程
------------------------------------
Openresty 官方模塊
Openresty 標準模塊(Opm)
Openresty 三方模塊
------------------------------------
本博收藏大部分文章為轉載,并在文章開頭給出了原文出處,如有再轉,敬請保留相關信息,這是大家對原創作者勞動成果的自覺尊重?。∪鐬槟鷰聿槐悖堄诒静┫铝粞?,謝謝配合。

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

相冊

Awesome

Blog

Book

GitHub

Link

搜索

  •  

積分與排名

  • 積分 - 219730
  • 排名 - 117

最新評論

閱讀排行榜

Erlang初學:Erlang的一些特點和個人理解總結
http://www.jb51.net/article/61047.htm

我對 Erlang 編程理念的理解:以分布式架構師的角度寫代碼。

函數式編程

Erlang 里面的函數是數學里面的函數:必須有返回值。 只要是函數必然有返回值,函數是一個過程,以英文的句號為函數結束符。 函數結束之前的表達式就是該函數的返回值。 所以這也是在 Erlang 里面的函數不會看到任何 return 語句的原因。 C++ 等其他語言的函數和函數之前可以通過共享變量來實現消息傳遞。 Erlang 里面的函數不可以,消息的傳遞通過函數的傳入和傳出。 也只是為什么 Erlang 號稱天生之處并行處理的原因, 因為他們不共享變量,也就不需要加鎖。

很多人聽到函數式編程都會覺得高大上或者晦澀難懂。 因為函數是編程沒有 for 循環語句, 但是在我看來,關鍵在于會使用【列表推倒】和【尾遞歸】來進行循環遍歷。 說到函數式編程就會拿快速排序說事,下面這個示例是 Erlang 版本的快速排序:

復制代碼 代碼如下:

-module(sort).

 

-export([qsort/1]).

qsort([]) -> [];
qsort([Pivot | T]) ->
    qsort([X || X <- T, X < Pivot]
         ++ [Pivot] ++
         qsort([X || X <- T, X >= Pivot]).


非常簡潔,[Pivot | T] 就是拿列表的第一個元素當快排中的 Pivot 。
復制代碼 代碼如下:

[X || X <- T, X < Pivot]

上式就是【列表推導】, 含義就是找出列表 T 中所有元素小于 Pivot 中的元素組成一個新的列表。 不過,這個例子顯然性能不高,只是一個示例。

 

很多人一直在鼓吹函數式語言馬上就要迎來朝陽, 但是在我看來,函數式編程永遠只能是小眾語言, 這就像當年的 lisp machine ,被鼓吹的天花亂墜還是夭折了。 現在主流的計算機架構都是馮諾依曼體系的,并不是最適合函數式語言的生存土壤。

一切都是常量

沒有變量,也就沒有通過變量共享狀態導致的資源競爭,也就不需要加鎖。 任何狀態的變化都是通過函數的輸入輸出來進行改變, 輕量級進程的狀態變化也是靠消息傳遞(函數的輸入輸出)來實現。 這也是為什么有人說函數式編程適合高并發的原因,因為他們沒有變量, 一切都是常量。

輕量進程

Erlang 里面有 spawn 函數,可以快速的創建一個 process , 這里的 process 不是操作系統的進程,而是 Erlang 自己的輕量進程。 Erlang 輕量到超乎你想象, 構建 kv 數據庫的時候,甚至可以對不同的 key 分配給不同的進程。 而且進程的表示單位是 Pid ,只要知道進程的 Pid, 哪怕該進程是在別的機器上面,都可以很輕易的發送給它。 原因是 Erlang 的【天生自帶RPC通信】和【自帶端口映射】

天生自帶RPC通信

復制代碼 代碼如下:

ToPid ! Data

ToPid 是接受方進程的id , Data 可以是 Erlang 的任何類型,比如
復制代碼 代碼如下:

Pid ! {name, "jb51.net"}.

也就是可以直接把任何數據結構當成消息發送,天生自帶 RPC 通信。 (雖然本來 RPC 的含義是“遠程過程調用”,不過其實反正就是幫你序列化了數據結構,Erlang 的 ! 操作符也是如此。)

 

進程端口映射

節點之間發消息在代碼里面的表示也還是

復制代碼 代碼如下:

ToPid ! Data

也就是在寫代碼的時候,根本不用考慮該進程是在哪臺機器上面, 無論是本 Erlang 進程(這里的進程是操作系統級別的進程,不是 Erlang 的輕量進程) 內, 還是其他機器的進程,都不用管。 這是因為有 epmd 的存在。

 

Epmd是Erlang Port Mapper Daemon的縮寫,在Erlang集群中相當于dns的作用,供給節點名稱到端口的查詢辦事,epmd綁定在總所周知的4369端口上。

有了 epmd ,寫分布式程序就好像寫單機程序一樣簡單。

嚴密的模塊化管理

Erlang 的模塊類似 C++ 中的 namespace(命名空間),但是比命名空間更利于高效的軟件工程管理。

在 Erlang 項目源碼中處處可見如下代碼。

 

復制代碼 代碼如下:

-module(my_app).
-export([start/2, stop/1]).

 

-module 指明模塊名,-export 指明導出的函數。 未被導出的函數都無法被外界調用。 從軟件工程上看的話,這樣使得模塊功能和使用方法更加清晰。 使用者只需要關心如何 -export 里面的函數即可。 相比較之下 C++ 對這方面特別不規范,而 Java 通過對類聲明為 public class 指明可以被外界使用, Node.js 也是使用 export 來顯示聲明可以被外界使用的函數。

行為模式

復制代碼 代碼如下:

-module(ecomet_app).

 

-behaviour(application).

%% comment: Application callbacks
-export([start/2, stop/1]).
-behavior(application).

 

Erlang/otp 里面的【行為模式】概念等價于 OOP 里面的接口概念。 上面代碼示例的意思就是該模塊(ecomet_app)遵守的行為模式是(application)。 剛行為模式需要實現的兩個接口函數就是 -export([start/2, stop/1]). 。

另一個示例如下是遵守監督者(supervisor)行為模式, 實現的一個接口函數是 -export([init/1]). 。

復制代碼 代碼如下:

-module(ecomet_sup).

 

-behaviour(supervisor).

%% Supervisor callbacks
-export([init/1]).

 

監督者機制

Erlang/otp 的天生分布式特性在監督機制里面體現的很好, 每一個 otp 應用啟動的時候,都是啟動監督者(supervisor)和工作者(worker)。 他們的關系是樹形結構,每個工作者的上級都會有監督者, 每個監督者的上級也可能有監督者。 當工作者異常退出的時候,監督者會根據相應的參數決定是否對工作者進行重啟。 如果重啟失敗的話監督者也會退出,而更加上層的監督者收到信號后會對他們進行重啟等處理。 這個監督者機制非常好理解,其實就是 OOP 編程里面的 try ... catch 異常處理機制。 當出現異常的時候一層一層的往上拋出,直到有人重啟。

otp平臺

Erlang 最強大的地方也是最讓我感覺難學的地方,就是它的 otp 平臺。 各種行為模式, 讓我感覺就像多年以前學習 MFC 的時候, 感覺很強大,但是卻總是感覺自己被按死在一條特定的軌道上面奔跑, 有種不自由的疲憊感。

代碼熱切換

熱切換也叫熱升級,大部分情況下,如果需要對 C++/Java 程序進程版本升級, 則需要重啟進程。 Erlang 支持熱切換的意思就是可以在運行的時候進行代碼升級。 升級過程不影響進程的運行, 而且在過渡階段新舊版本還可以共存。 是不是碉堡了。這個功能對于那些需要 7x24 高可用的服務來說簡直就是爽爆了。

Erlang 進程本身可以通過一個類似“后門”的控制臺 erl 來實時的查看狀態, 甚至直接使用控制臺來修改配置等,非常方便,這對于大部分其他語言來說, 簡直就是黑魔法般神奇的存在。

典型缺點

1.文檔太少,出現問題搜索出來的答案也少。
2.Erlang 人才稀缺,招聘不易。
3.動態語言最典型的就是調試不易。
4.上手門檻較高。

最后,我只是 Erlang 的入門初學者, 因為工作中需要使用 ejabberd (Erlang 的開源項目), 從而學習了 Erlang , 欠缺實戰經驗,所以這篇文章標題起為 【Erlang初體驗】。

http://www.jb51.net/article/61869.htm

這篇文章主要介紹了Erlang中的OTP簡介,OTP包含了一組庫和實現方式,可以構建大規模、容錯和分布式的應用程序,包含了許多強大的工具,能夠實現H248,SNMP等多種協議,需要的朋友可以參考下

OTP包含了一組庫和實現方式,可以構建大規模、容錯和分布式的應用程序,包含了許多強大的工具,能夠實現H248,SNMP等多種協議,核心概念是OTP行為,可以看作一個用回調函數作為參數的應用程序框架,類似一個J2EE容器。行為負責解決問題的非函數部分,回調函數負責解決函數部分。
 
通過gen_server模塊可以實現事物語義和熱代碼交換,

1)      確定回調模塊名
2)      編寫接口函數
3)      在回調模塊里編寫6個必需的回調函數

當服務器崩潰時,需要一種機制來檢測并重啟它,要用到監測樹,即創建一個監控器來管理服務器。監測樹有兩種:一對一和一對多。

復制代碼 代碼如下:

$erl –boot start_sasl

會創建一個運行生產系統的環境,系統架構支持庫(SASL,System Administration Support Libriaries)將負責錯誤記錄和過載保護等工作。
 
使用gen_server, gen_supervisor,application等行為,可以構建可靠性為99.9999999的系統。
統一化的erlang消息:

 

1)  抽象了不同線路協議之間的區別
2)  Erlang消息無需解析,接收進程不必先解析消息再處理,而http服務器就必須解析就收到的所有消息
3)  Erlang消息可以包含任意復雜度的數據類型,而http消息必須被序列化成扁平化才能傳輸
4)  Erlang消息可以在不同處理器之間傳送

常見的第三方庫有rebar(https://github.com/basho/rebar)和cowboy(https://githun.com/extend/cowboy)。 Rebar是管理erlang項目的事實標準,用戶可以通過rebar創建新項目、編譯項目、打包它們,以及把它們與其他項目整合在一起,同時集成了github。Cowboy是一個用erlang編寫的高性能web服務器,是嵌入式web的熱門實現。另外,庫mochiweb2(http://github.com/mochi/mochiweb)的編碼和解碼方法可以實現json字符串和erlang數據類型的相互轉換。
 
Erlang程序在多核CPU上運行

1)  使用大量進程
2)  避免副作用,例如不使用共享式ETS或DETS
3)  避免順序瓶頸,可以選擇pmap代替map
4)  小消息,大計算
5)  用mapreduce使計算并行化
mapreaduce是一個并行高階函數,定義如下

復制代碼 代碼如下:

-specmapreduce(F1,F2,Acc0,L) ->Acc
         F1 = fun(Pid,X) ->void
         F2 = fun(Key,[Value],Acc0) ->Acc
         L = [X]
         Acc = X =term()

Mapreduce 是在并行高階函數(phofs)模塊中定義的。

 


http://www.jb51.net/article/61870.htm
這篇文章主要介紹了Erlang中的socket編程簡單例子,本文給出了TCP服務器echo示例、Tcp 的echo客戶端示例、UDP server示例、UDP client 示例,需要的朋友可以參考下

Erlang 中gen_tcp 用于編寫TCP程序,gen_udp用于編寫UDP程序。一個簡單的TCP服務器echo示例

復制代碼 代碼如下:

Start_echo_server()->
         {ok,Listen}= gen_tcp:listen(1234,[binary,{packet,4},{reuseaddr,true},{active,true}]),
         {ok,socket}=get_tcp:accept(Listen),
         gen_tcp:close(Listen),
         loop(Socket).
 
loop(Socket) ->
         receive
                  {tcp,Socket,Bin} ->
                            io:format(“serverreceived binary = ~p~n”,[Bin])
                            Str= binary_to_term(Bin),
                            io:format(“server  (unpacked) ~p~n”,[Str]),
                            Reply= lib_misc:string2value(Str),
                            io:format(“serverreplying = ~p~n”,[Reply]),
                            gen_tcp:send(Socket,term_to_binary(Reply)),
                            loop(Socket);
                   {tcp_closed,Socket} ->
                            Io:format(“ServerSocket closed ~n”)
         end.

Tcp 的echo客戶端示例:
復制代碼 代碼如下:

echo_client_eval(Str) ->
         {Ok,Socket} = gen_tcp:connect(“localhost”,2345,[binary,{packet,4}]),
         ok= gen_tcp:send(Socket, term_to_binary(Str)),
         receive
                   {tcp,Socket,Bin}->
                            Io:format(“Clientreceived binary  = ~p~n”,[Bin]),
                            Val=binary_to_term(Bin),
                            io:format(“Clientresult = ~p~n”,[Val]),
                            gen_tcp:close(Socket)
         end.

UDP server示例
復制代碼 代碼如下:

udp_demo_server(Port) ->
         {ok,Socket}= gen_udp:open(Open,[Binary]),
         loop(Socket).
Loop(Socket)->
         receive
                   {udp,Socket,Host,Port,Bin}->
                            BinReply= …,
                            gen_udp:send(Socket,Host,Port,BinReply),
                            loop(Socket)
         End.

UDP client 示例:
復制代碼 代碼如下:

udp_demo_client(Request) ->
         {ok,Socket}= gen_udp:open(0,[Binary]),
         ok= gen_udp:send(Socket,”localhost”,1234,Request),
         Value=    receive
                                     {udp,Socket,_,_,Bin}-> {ok,Bin}
                            after2000 -> error
                            end,
         gen_udp:close(Socket),
         Value

注意,因為UDP是不可靠的,一定要設一個超時時間,而且Reqeust最好小于500字節。
WebSocket, JS 和Erlang相結合,能夠實現Web的絕大多數功能。
 
posted on 2016-12-19 11:49 思月行云 閱讀(444) 評論(0)  編輯 收藏 引用 所屬分類: Erlang
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲永久在线| 亚洲欧洲视频| 久久久九九九九| 一区在线免费| 亚洲国产成人一区| 欧美激情国产精品| 亚洲一级网站| 欧美一级一区| 在线观看的日韩av| 日韩视频一区| 国产偷久久久精品专区| 欧美黑人一区二区三区| 欧美片第一页| 久久久久欧美精品| 欧美大片免费久久精品三p| 亚洲一区二区3| 欧美主播一区二区三区美女 久久精品人 | 亚洲私拍自拍| 在线 亚洲欧美在线综合一区| 亚洲日本中文字幕| 国产精品一区二区视频| 欧美成人一区二区在线| 国产精品乱码一区二三区小蝌蚪| 模特精品在线| 国产麻豆精品在线观看| 欧美激情视频在线播放 | 亚洲精品视频在线播放| 日韩亚洲国产欧美| 国内精品久久久久久影视8| 亚洲国产视频一区二区| 国产视频观看一区| 亚洲人成绝费网站色www| 国外成人在线视频| 亚洲精品欧美日韩专区| 狠狠爱成人网| 亚洲免费中文字幕| 亚洲日韩欧美视频一区| 欧美一区二区视频免费观看| 一区二区日韩精品| 男人插女人欧美| 久久久久一区二区| 国产精品久久7| 亚洲人成在线观看| 亚洲第一搞黄网站| 性伦欧美刺激片在线观看| 一本久道久久综合中文字幕| 老司机精品视频一区二区三区| 午夜精品久久久久久久| 欧美午夜激情在线| 亚洲日本中文字幕| 亚洲日本成人女熟在线观看| 欧美在线观看视频在线| 欧美一区不卡| 国产精品中文字幕欧美| 9色精品在线| 夜夜嗨av一区二区三区网页| 免费观看一级特黄欧美大片| 欧美成人精品在线观看| 亚洲成人在线网| 久久久免费精品| 另类激情亚洲| 在线播放中文一区| 久久五月天婷婷| 美女诱惑黄网站一区| 在线 亚洲欧美在线综合一区| 久久精品亚洲一区二区| 久久综合亚州| 亚洲观看高清完整版在线观看| 久久资源av| 欧美激情精品久久久久久久变态 | 欧美午夜免费影院| 一区二区三区成人| 午夜视频久久久| 国产乱子伦一区二区三区国色天香| 亚洲欧美日韩综合一区| 久久视频在线免费观看| 亚洲高清毛片| 欧美日韩一区在线| 亚洲午夜精品久久久久久app| 西西人体一区二区| 狠狠爱www人成狠狠爱综合网| 老鸭窝亚洲一区二区三区| 亚洲国语精品自产拍在线观看| 日韩视频亚洲视频| 国产精品久久久久久久久动漫| 销魂美女一区二区三区视频在线| 久久久久女教师免费一区| 亚洲国产一区二区三区青草影视 | 国产伦精品一区二区三区四区免费 | 国产亚洲午夜高清国产拍精品| 久久国产天堂福利天堂| 亚洲国产精品成人一区二区| 亚洲一区在线观看视频 | 亚洲欧洲综合另类在线| 国产精品wwwwww| 久久国产婷婷国产香蕉| 亚洲人体偷拍| 久久久久久穴| 亚洲视频在线免费观看| 国产亚洲人成a一在线v站| 欧美韩国日本一区| 欧美在线一区二区| 91久久在线视频| 久久久国产精彩视频美女艺术照福利| 亚洲国内自拍| 国产亚洲a∨片在线观看| 欧美电影在线观看| 久久精品电影| 亚洲男女毛片无遮挡| 亚洲国产精品激情在线观看 | 亚洲高清自拍| 国产日韩欧美二区| 欧美日韩精品在线观看| 久久久99爱| 亚洲一级一区| 日韩亚洲视频| 亚洲国产精品久久久久婷婷老年 | 亚洲精品久久久蜜桃| 嫩模写真一区二区三区三州| 性欧美大战久久久久久久久| 亚洲美女少妇无套啪啪呻吟| 黄色亚洲在线| 国产九九精品视频| 欧美日韩一级黄| 蜜乳av另类精品一区二区| 久久精品成人一区二区三区蜜臀 | 亚洲免费综合| 亚洲视频大全| 日韩一区二区免费高清| 亚洲国产欧美日韩| 欧美jizz19hd性欧美| 久久久亚洲综合| 久久精品91| 久久久久久夜精品精品免费| 欧美一区二区高清在线观看| 亚洲网址在线| 亚洲欧美日韩综合| 亚洲视频在线一区| 亚洲欧美成人一区二区三区| 亚洲一区日韩| 亚洲永久精品大片| 香蕉成人啪国产精品视频综合网| 亚洲少妇一区| 亚洲一二区在线| 亚洲欧美激情视频| 亚洲欧美在线x视频| 午夜宅男久久久| 久久国产欧美精品| 另类天堂av| 欧美激情导航| 99国产精品| 亚洲永久视频| 久久久久国色av免费观看性色| 久久精品女人天堂| 欧美~级网站不卡| 亚洲国产成人精品女人久久久 | 欧美一区二区免费| 久久免费精品视频| 男女激情视频一区| 亚洲三级视频在线观看| 99精品福利视频| 亚洲免费网站| 美国十次了思思久久精品导航| 能在线观看的日韩av| 欧美性猛交视频| 国产一区二区三区四区五区美女| 亚洲大片av| 亚洲一区高清| 久久综合成人精品亚洲另类欧美| 亚洲福利视频免费观看| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美jizz19hd性欧美| 亚洲精品日韩激情在线电影| 亚洲一区二区动漫| 久久久噜久噜久久综合| 欧美日韩美女一区二区| 国产亚洲一级| 正在播放欧美视频| 久久久国产一区二区三区| 亚洲电影免费在线| 午夜天堂精品久久久久| 欧美α欧美αv大片| 国产精品嫩草影院av蜜臀| 在线免费观看一区二区三区| 亚洲手机在线| 免费观看成人| 亚洲综合成人在线| 欧美区一区二| 黄色一区二区在线| 亚洲欧美日产图| 亚洲精华国产欧美| 欧美一区二区三区免费视频| 欧美久久久久免费| 亚洲大胆视频| 久久久久在线观看| 中文精品一区二区三区| 欧美夫妇交换俱乐部在线观看| 国产一区二区在线观看免费| 亚洲男女毛片无遮挡| 亚洲国产视频一区二区|