[Erl_Question17]那些經曆過的Erlang小坑21~30

來源:互聯網
上載者:User

標籤:des   cWeb   style   blog   http   color   java   使用   

 

21.在產生隨機數過程中一直使用:

random:seed(erlang:now()).

erlang:now()是可以一直遞增的數,從不重複,但是不適合用於隨機演算法,最好使用下面這種:

-spec get_random_num(integer()) -> integer().get_random_num(Max) ->    <<A:32, B:32, C:32>> = crypto:rand_bytes(12),    random:seed({A,B,C}),    random:uniform(Max).

22.Pid的那3位元字<A,B,C>代表著什嗎?

  • A, 對應是哪一個節點 (0 代表是本地節點 ,其它數字代表遠程節點) ;
  • B, 低15位元組代表進程唯一記數(一個進程表的索引)
  • C, 16~18位元組也是進程唯一記數(和B一樣)

http://stackoverflow.com/questions/243363/can-someone-explain-the-structure-of-a-pid-in-erlang

驗證如下:

開啟一個終端test1

開啟終端test2

23.gen_server進程如果長期不需要處理其它訊息,可以使用傳回值{noreply,hibernate}進入休眠狀態:使用情境:

比如使用者知道在處理完一個特定的訊息後這個進程在很長一段時間內不會再有訊息處理,可以設定這個訊息的返回後進入hibernate狀態!

這可以減少記憶體和cpu消耗。

24.Record這麼好用,為什麼還是有很多大神吐槽record非常不好?

缺點:

%%1.只能使用原子作為index元素;%% 2.編譯前就確定了結構,不能動態增加index,比如person要增加一個phone屬性,record是做不到的。

所以17後就有了Map這個資料結構,可以突破上面的限制,真正的Map.

http://www.cnblogs.com/zhengsyao/p/erlang_map_brief.html

但是目前的mnesia只支援record的。不支援map,那Record的升級麻煩還會在mneisa中繼續存在的。

25. receive 裡面after的妙用:

進程阻塞時,用於清空進程信箱訊息,

receive  Msg ->           do_something(Msg);after 0 ->      do_something2)end.

關鍵看清楚那個after 0 ,調用這個函數就會把這個進程以前舊的訊息都用do_something(Msg)處理掉:(當然你的do_something/1裡面會尾遞迴調用回這個函數啦)

25.ETS 的預設限制個數為1400個,你可以通過:

erl -env ERL_MAX_ETS_TABLES Number

來改變這個預設值,但是這個限制也提示了一個非常重要的資訊:不要嘗試每一個進程都建立一個ets表!

26. 不要跨節點串連或監控(link,monitor)很多進程:

因為如果節點由於網路故障通訊斷了,那麼所有link或monitor的進程會被馬上觸發,產生超大量的訊息分給超多的進程,這就會給系統增加非常大的負擔。

27.使用receive 嵌套實現接收訊息的先後關係:

receive       {first_deal_msg,Msg} ->                 do_someting(Msg),                  receive                        {second_deal_msg,Msg2} ->                              do_someting2(Msg2)                  endend.

28.Erlang為什麼叫Erlang?(哈哈,亂入一通):

erlang

n.厄蘭(話務單位),佔線小時;

名副其實的為通訊而先的語言哇…

29.begin end語句塊的簡潔使用:
問題描述:
將一堆人隨機平均分開2組,,怎樣去平均?

當然效率不高,但是!看上去很cool…

30. split_binary/2

It is usually more efficient to split a binary using matching instead of calling the split_binary/2 function. Furthermore, mixing bit syntax matching and split_binary/2 may prevent some optimizations of bit syntax matching.

使用位元文法來分離二進位比用split_binary/2更加高效,更進一步來講,混合使用位元文法和split_binary/2會把編譯器弄sb的(不會進行相關的最佳化任務了)

DO

<<Bin1:Num/binary,Bin2/binary>> = Bin,

DO NOT

{Bin1,Bin2} = split_binary(Bin, Num)

生活沒有什麼過不去的坎。開心過 ^ ^

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.