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

Fork me on GitHub
隨筆 - 215  文章 - 13  trackbacks - 0
<2016年12月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567


專注即時通訊及網(wǎng)游服務(wù)端編程
------------------------------------
Openresty 官方模塊
Openresty 標準模塊(Opm)
Openresty 三方模塊
------------------------------------
本博收藏大部分文章為轉(zhuǎn)載,并在文章開頭給出了原文出處,如有再轉(zhuǎn),敬請保留相關(guān)信息,這是大家對原創(chuàng)作者勞動成果的自覺尊重!!如為您帶來不便,請于本博下留言,謝謝配合。

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

相冊

Awesome

Blog

Book

GitHub

Link

搜索

  •  

積分與排名

  • 積分 - 221722
  • 排名 - 117

最新評論

閱讀排行榜

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

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

函數(shù)式編程

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

很多人聽到函數(shù)式編程都會覺得高大上或者晦澀難懂。 因為函數(shù)是編程沒有 for 循環(huán)語句, 但是在我看來,關(guān)鍵在于會使用【列表推倒】和【尾遞歸】來進行循環(huán)遍歷。 說到函數(shù)式編程就會拿快速排序說事,下面這個示例是 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 中的元素組成一個新的列表。 不過,這個例子顯然性能不高,只是一個示例。

 

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

一切都是常量

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

輕量進程

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

天生自帶RPC通信

復制代碼 代碼如下:

ToPid ! Data

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

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

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

 

進程端口映射

節(jié)點之間發(fā)消息在代碼里面的表示也還是

復制代碼 代碼如下:

ToPid ! Data

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

 

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

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

嚴密的模塊化管理

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

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

 

復制代碼 代碼如下:

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

 

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

行為模式

復制代碼 代碼如下:

-module(ecomet_app).

 

-behaviour(application).

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

 

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

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

復制代碼 代碼如下:

-module(ecomet_sup).

 

-behaviour(supervisor).

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

 

監(jiān)督者機制

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

otp平臺

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

代碼熱切換

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

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

典型缺點

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

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

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

這篇文章主要介紹了Erlang中的OTP簡介,OTP包含了一組庫和實現(xiàn)方式,可以構(gòu)建大規(guī)模、容錯和分布式的應(yīng)用程序,包含了許多強大的工具,能夠?qū)崿F(xiàn)H248,SNMP等多種協(xié)議,需要的朋友可以參考下

OTP包含了一組庫和實現(xiàn)方式,可以構(gòu)建大規(guī)模、容錯和分布式的應(yīng)用程序,包含了許多強大的工具,能夠?qū)崿F(xiàn)H248,SNMP等多種協(xié)議,核心概念是OTP行為,可以看作一個用回調(diào)函數(shù)作為參數(shù)的應(yīng)用程序框架,類似一個J2EE容器。行為負責解決問題的非函數(shù)部分,回調(diào)函數(shù)負責解決函數(shù)部分。
 
通過gen_server模塊可以實現(xiàn)事物語義和熱代碼交換,

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

當服務(wù)器崩潰時,需要一種機制來檢測并重啟它,要用到監(jiān)測樹,即創(chuàng)建一個監(jiān)控器來管理服務(wù)器。監(jiān)測樹有兩種:一對一和一對多。

復制代碼 代碼如下:

$erl –boot start_sasl

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

 

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

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

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

復制代碼 代碼如下:

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

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

 


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

Erlang 中g(shù)en_tcp 用于編寫TCP程序,gen_udp用于編寫UDP程序。一個簡單的TCP服務(wù)器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是不可靠的,一定要設(shè)一個超時時間,而且Reqeust最好小于500字節(jié)。
WebSocket, JS 和Erlang相結(jié)合,能夠?qū)崿F(xiàn)Web的絕大多數(shù)功能。
 
posted on 2016-12-19 11:49 思月行云 閱讀(449) 評論(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>
            在线亚洲一区观看| 亚洲区免费影片| 欧美三级午夜理伦三级中视频| 久久精品99无色码中文字幕| 欧美三级乱码| 亚洲国产成人久久综合一区| 激情久久五月| 欧美一级播放| 亚洲欧美日韩高清| 欧美体内she精视频在线观看| 欧美电影专区| 亚洲成色精品| 久久久噜噜噜久久狠狠50岁| 久久久久久夜| 国产视频在线观看一区二区三区| 一区二区三区四区国产| 一区二区三区国产精品| 欧美精品一区二区三区在线播放| 欧美大片在线观看一区| 亚洲黄色片网站| 欧美好吊妞视频| 91久久国产综合久久91精品网站| 亚洲国产综合91精品麻豆| 久久一区二区三区av| 欧美~级网站不卡| 亚洲国产婷婷综合在线精品| 久久综合99re88久久爱| 亚洲高清视频在线| 日韩视频在线一区| 欧美日韩亚洲系列| 中文国产成人精品久久一| 亚洲影视九九影院在线观看| 国产精品自在线| 欧美综合国产精品久久丁香| 久久综合国产精品台湾中文娱乐网| 99精品欧美一区二区三区| 亚洲午夜免费视频| 午夜在线视频观看日韩17c| 国产精品一区二区在线观看不卡| 亚洲一线二线三线久久久| 欧美在线短视频| 在线观看91精品国产麻豆| 久久午夜精品| 亚洲乱码国产乱码精品精天堂 | 日韩小视频在线观看专区| 欧美精品xxxxbbbb| 一区二区三区欧美| 久久久人成影片一区二区三区 | 美国十次成人| 亚洲美女av黄| 国产欧美日本一区二区三区| 久久久久国产免费免费| 亚洲国产精品高清久久久| 一区二区三区精密机械公司| 国产日韩欧美在线观看| 女生裸体视频一区二区三区| 亚洲午夜国产成人av电影男同| 久久亚洲精品视频| 亚洲最新色图| 精品动漫av| 国产精品久久久久久av下载红粉 | 欧美日韩一区二区三区视频| 亚洲专区一区| 欧美国产日韩一区二区在线观看| 亚洲免费一级电影| 亚洲国产成人久久综合一区| 国产精品久久久久一区二区| 久久综合99re88久久爱| 亚洲婷婷免费| 91久久中文字幕| 久久久久久亚洲精品不卡4k岛国| 一区二区国产日产| 尤物精品在线| 国产精品综合色区在线观看| 欧美精品激情在线观看| 欧美一级视频一区二区| 99视频超级精品| 亚洲第一视频| 亚洲精品欧美专区| 欧美激情久久久久| 亚洲摸下面视频| 亚洲国产成人在线播放| 久久成人一区二区| 亚洲在线播放电影| 亚洲精品美女在线观看播放| 狠狠狠色丁香婷婷综合激情| 欧美性jizz18性欧美| 欧美成人蜜桃| 久久女同互慰一区二区三区| 亚洲综合国产| 在线一区欧美| 日韩一级黄色大片| 亚洲经典三级| 亚洲高清视频一区二区| 欧美69wwwcom| 久久亚洲影音av资源网| 欧美亚洲一区三区| 先锋影音久久| 亚洲欧美怡红院| 亚洲天堂网站在线观看视频| 99riav国产精品| 99精品国产高清一区二区| 亚洲福利视频免费观看| 国内综合精品午夜久久资源| 国产午夜久久久久| 国产日韩欧美三级| 国产一区二区三区成人欧美日韩在线观看 | 欧美在线黄色| 久久精品91| 久久久免费观看视频| 久久久久久久一区二区三区| 久久国产精品一区二区三区四区| 欧美一级黄色网| 久久爱91午夜羞羞| 久久视频免费观看| 另类尿喷潮videofree| 麻豆成人在线观看| 欧美成人激情在线| 亚洲高清在线观看一区| 亚洲精品一区二区三区蜜桃久 | 久久久久国产精品厨房| 久久成人这里只有精品| 亚洲欧美制服另类日韩| 性久久久久久| 噜噜噜久久亚洲精品国产品小说| 亚洲国产高清一区二区三区| 在线观看成人一级片| 亚洲国产视频a| 亚洲视频中文| 欧美在线观看一区二区| 榴莲视频成人在线观看| 欧美69视频| 在线视频一区二区| 性欧美video另类hd性玩具| 久久午夜电影网| 欧美日韩国产成人| 国产欧美一区在线| 亚洲国产成人av| 亚洲图片欧美午夜| 久久精品国产在热久久| 欧美激情欧美激情在线五月| 夜夜躁日日躁狠狠久久88av| 午夜欧美精品久久久久久久| 久久夜色精品国产欧美乱| 欧美三级在线| 亚洲高清不卡在线| 亚洲欧美日韩中文播放| 欧美大片专区| 亚洲一区视频在线观看视频| 久久久五月婷婷| 国产精品久久久久久久午夜片| 在线观看国产精品淫| 亚洲欧美中日韩| 欧美激情中文字幕乱码免费| 亚洲手机视频| 欧美激情按摩| 精品91免费| 午夜精品亚洲| 亚洲精品免费看| 久久婷婷久久一区二区三区| 国产精品乱码一区二三区小蝌蚪 | 玉米视频成人免费看| 亚洲性视频网站| 怡红院av一区二区三区| 亚洲经典一区| 久久精品一二三区| 日韩一区二区精品| 欧美 日韩 国产在线 | 国产精品s色| 亚洲精品久久久久久久久久久| 久久国产精品色婷婷| 一区二区三区欧美| 欧美日本韩国一区| 亚洲精品1区2区| 久久久综合网站| 亚洲欧美日韩国产精品| 欧美小视频在线观看| 一区二区久久久久| 亚洲国产一区二区视频| 老鸭窝91久久精品色噜噜导演| 国产一区二区三区精品欧美日韩一区二区三区 | 国产精品美女久久久免费| 99re66热这里只有精品4| 嫩草伊人久久精品少妇av杨幂| 午夜精品久久久久久久蜜桃app | 久久一二三四| 在线电影一区| 另类成人小视频在线| 久久超碰97人人做人人爱| 国产欧美在线| 久久精品网址| 久久激情综合网| 精品999在线观看| 美日韩精品免费| 久久综合九色综合欧美狠狠| 一区在线影院| 欧美1区视频| 欧美电影在线播放| 99伊人成综合| 在线亚洲电影|