2011-10-07 23 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秒内没有得到答复,它将退出。