erlang學習筆記3-併發

Erlang進程之間沒有共享內存,每個進程都有它本身的內存。想要修改其餘進程的內在你只能向它發送一個消息,而後但願它能收到並且能理解這個消息。
 
建立和銷燬進程很是迅速;
在兩個進程間收發消息很是迅捷;
進程在全部操做系統上行爲相同;
能夠建立大量進程;
進程之間不共享任何數據,彼此徹底獨立;
進程間交互的惟一方法就是經過消息傳遞。
 
併發原語:
     Pid = spawn(Fun) 
     建立一個新的併發進程,用於對Fun求值。
     Pid ! Message
          向標識符爲Pid的進程發送消息。消息發送是異步的。
     receive ... end
          接收一個發送給當前進程的消息。
          receive
               Pattern1 [when Guard1] ->
                    Expressions1;
               Pattern2 [when Guard2] ->
                    Expressions2;
               ...
          end
 
客戶/服務器架構:
     rpc通訊
 
     使用erlang:system_info(process_limit)查找系統容許的進程上限。
 
 
帶超時的receive
receive 
     Pattern1 [when Guard1] ->
          Expressions1;
     Pattern2 [when Guard2] ->
          Expressions2;
     ...
after Time ->
     Expressions
end
 
選擇性接收:
     send 把一個消息發送到一個進程的郵箱中去。同理receive則是在試圖把一條消息從進程郵箱中刪除。
     receive的內部工做機制是:
          一、當進入一個receive語句時,咱們啓動一個計時器(只有表達式中存在after段時纔會計時)。
          二、從郵箱中取出每一個消息,而後嘗試進行模式匹配。若是匹配成功,消息就從郵箱中刪除,對應的模式以後的表達式就會被求值。
          三、若是郵箱中的第一個消息不能匹配receive語句的任何一個模式,那麼就會將第一個消息從郵箱中刪除並送入一個「保存隊列」,而後繼續嘗試郵箱中的第二個消息。這個過程會不斷重複直到找到匹配的消息,或者郵箱中全部的消息所有檢查完畢。     
          四、若是郵箱中全部的消息都不能匹配,那麼就掛起進程,直到下一次又有新的消息進入郵箱時再對該進程進行從新調度執行。注意,當一個新消息到達時,只對新消息進行匹配而不會對保存隊列中的消息進行再次匹配。
          五、一個消息若是被匹配,那麼存入保存隊列中的全部消息就會按照它們到達進程的時間前後順序從新放回郵箱中。這時,若是開啓了一個計時器,那麼這個計時器就會被清空。
          六、若是在咱們等待一個消息時觸發了計時器,那麼對錶達式ExpressionsTimeout求值而後把存入保存隊列中的全部消息按照它們到達進程的時間前後順序從新放回郵箱中。
 
註冊進程:
     register(AnAtom, Pid)
     unregister(AnAtom)
     whereis(AnAtom) ->Pid | undefined
     registered() -> [AnAtom::atom()]
 
尾遞歸技術:
     erlang中的尾遞歸的函數能夠無限循環而不須要消耗棧空間。
 
使用MFA啓動進程:
     以顯式指明模塊、函數名和參數列表的形式來啓動一個新進程。
相關文章
相關標籤/搜索