在erlang中進行程序間通訊的唯一方法就是訊息傳遞。乙個訊息通過原語!(send)傳送給另乙個程序:
pid ! message
send是乙個會對其引數進行求值的原語。它的返回值是傳送的訊息。
原語receive被用於接收訊息。它的語法如下:
receive
message1 [when guard1]
->
actions1 ;
message2 [when guard2]
->
actions2 ;
end.
每個程序都有乙個郵箱,所有傳送到該程序的訊息都被按照它們到達的順序依次儲存在郵箱裡。
當找到乙個匹配的訊息並且對應的保護式(guard)滿足的時候,這個訊息就被選中,並從郵箱中刪除,同時對應的actionsn會被執行。receive會返回actionosn中最後乙個表示式求值的結果。就如同erlang裡其他形式的模式匹配一樣,訊息模式中未繫結(unbound)量會被繫結(bound)被receive選中的訊息會按照原來的順序繼續留在郵箱中,用於下一次recieve的匹配。呼叫receive的程序會一直阻塞,直到有匹配的訊息為止。
當receive嘗試尋找乙個匹配的訊息的時候,它會依次對郵箱中的每乙個訊息嘗試用給定的每個模式去進行匹配。
有時候我們會只希望接收來自某乙個特定程序的訊息。要實現這個機制,訊息傳送者必須顯式地在訊息中包含自己的程序識別符號:
pid |
bif self()返回當前程序的識別符號。這樣的訊息可以通過如下方式來接收:
receive -
>
actions;
end.
短命名:
erl -sname node
節點使用主機名(hostname)作為在本地網路的表示。
長命名:
erl -name node
使用乙個全限定的網域名稱或ip位址。
在乙個分布式系統內,所有節點必須使用同一種命名模式,例如全是短命名或全是長命名。
為了能夠互相通訊,所有節點必須共享乙個私密的cookie值。相同cookie值的節點會進行全相連的網狀連線。
但如果在啟動節點時帶上-hidden標誌,節點就不會自動和任何節點連線。可以使用net_kernel模組進行細粒度的控制。
隱藏式節點有多重用途,比如用於運維或者作為橋連線不同的節點集群。
a節點連線b節點,如果在同一機器上,只需要程序間通訊就可以找到節點。
程序間通訊和執行緒間通訊
程序間通訊 ipc,interprocess communication 是一組程式設計介面,讓程式設計師能夠協調不同的程序,使之能在乙個作業系統裡同時執行,並相互傳遞 交換資訊。這使得乙個程式能夠在同一時間裡處理許多使用者的要求。因為即使只有乙個使用者發出要求,也可能導致乙個作業系統中多個程序的執...
程序間通訊和執行緒間通訊總結
死鎖的四個必要條件 資源有限 持有等待 不能搶占 迴圈等待條件 死鎖的應對方式 消除獨佔條件 即將資源無限增加或者變為共享 消除保持和請求條件 即乙個程序一次請求其所需要的所有資源,而不是請求一點資源做一點事情,但是這樣太過浪費。消除非搶占條件 即允許對資源進行搶占 消除迴圈等待條件 即產生迴圈等待...
程序間通訊 和 執行緒間同步
前經常搞混,所以記錄下來。程序間通訊主要是指多個程序間的資料互動。而執行緒間同步主要指維護多個執行緒之間資料準確 一致性。一.程序間通訊主要有以下幾種方式 管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 ...