2011-10-07 59 views
0

這可能是一個非常基本的問題,但是Erlang能夠在另一個prcoess上調用一個方法,並等待它返回一些沒有睡眠線程的對象類型?Erlang併發模型

回答

1

那麼,如果你是等待作爲答案,調用過程將不得不最終睡覺......但這沒什麼大不了的。

當進程卡在receive循環中時,其他進程可以工作。實際上,有數千個進程只是在等待消息的情況並不罕見。由於Erlang進程不是真正的操作系統線程,它們非常輕便,所以性能損失很小。

事實上,睡眠的實現方式是這樣的:

sleep(Milliseconds) -> 
    receive 
     % Intentionally left empty 
    after Milliseconds -> ok 
    end. 
1

是的,這是可以窺視到郵箱,如果這是你的意思。假設我們已經發送了一條消息給另​​一個進程,現在我們想知道另一個進程是否已經向我們發送了一些消息。但是,我們不希望在接收:

receive 
    Pattern -> Body; 
    Pattern2 -> Body2 
after 0 -> 
    AfterBody 
end 

會試圖匹配的郵箱PatternPattern2。如果沒有匹配,它會立即超時並轉至AfterBody。這使您可以實現對郵箱的無阻塞窺視。

如果過程是gen_server,當回調返回到gen_server的控件時,通過播放內部狀態和Timeout設置可以實現同樣的效果。您可以設置0的超時來實現此目的。

+0

*我給出答案答案*回答* Mike Dotnet *。世界到底是什麼? –

0

從問題得到的是我們正在談論的Synchronous Message Passing。是! Erlang可以很好地完成這項工作,它是處理Erlang中最基本的併發處理方式。考慮這個下面:

 
rpc(Request, To)-> 
    MySelf = self(), 
    To ! {MySelf,Request}, 
    receive 
    {To,Reply} -> Reply 
    after timer:seconds(5) -> erlang:exit({error,timedout}) 
    end. 

上面的代碼示出了一個進程將消息發送到另一個,並立即進入等待(用於應答),而不必睡覺。如果它在5秒內沒有得到答覆,它將退出。