这可能是一个非常基本的问题,但Erlang是否能够在另一个进程上调用一个方法,并等待它在没有休眠线程的情况下使用某种对象类型进行响应?
发布于 2011-10-08 02:06:05
如果您正在等待答案,那么调用进程最终将不得不休眠…但这没什么大不了的。
当进程停留在receive循环中时,其他进程可以工作。事实上,有数千个进程只等待消息的情况并不少见。由于Erlang进程不是真正的OS线程,它们是非常轻量级的,因此性能损失很小。
实际上,睡眠的实现方式如下所示:
sleep(Milliseconds) ->
receive
% Intentionally left empty
after Milliseconds -> ok
end.发布于 2011-10-08 08:14:39
是的,可以偷看邮箱,如果你是这个意思的话。假设我们向另一个进程发送了一条消息,现在我们想看看另一个进程是否向我们发回了一些消息。但是我们不想阻塞接收:
receive
Pattern -> Body;
Pattern2 -> Body2
after 0 ->
AfterBody
end将尝试与邮箱中的Pattern和Pattern2进行匹配。如果没有匹配,它将立即超时并转到AfterBody。这允许您实现对邮箱的非阻塞窥视。
如果进程是一个gen_server,那么当回调返回到gen_server的控制之下时,可以通过调整内部状态和Timeout设置来达到同样的效果。你可以设置0的超时来实现这一点。
https://stackoverflow.com/questions/7691081
复制相似问题