当erlang进程运行`receive after`时,进程状态是什么?

时间:2015-11-19 09:55:51

标签: erlang

我希望知道此进程运行时的erlang进程状态receive after

receive
  X ->
    ok
after 1000 ->
   ok
end

1,进程状态是在运行还是在等待?

2,此过程是否会使用cpu schedler时间?

3,如果我有120000这样的erlang进程,每个进程都将运行如下代码:

receive
      X ->
        ok
    after 1000 ->
       ok
end

那么,这段代码是否会成为瓶颈?

1 个答案:

答案 0 :(得分:2)

这个过程只是随着接收表达式之后的任何事情而移动。

例如,假设内联请求/响应:

ask_foo(SomePID) ->
    Ref = make_ref(),
    SomePID ! {self(), Ref, why},
    receive
        {Ref, Answer} ->
            io:format("The answer: ~tp~n", [Answer])
      after
        1000 ->
            io:format("~p is too slow. Moving on...~n", [SomePID])
    end,
    io:format("I'll print this in any case, and then exit.").

receive阻止,直到它收到匹配其中一个接收子句的消息,超时发生 - 以先发生者为准。然后它继续做其代码中的任何其他内容。通常只有一个receive循环,但是对于应该阻止的内容,如waiting on a fixed sequence of inputs from a user或类似内容,使用一系列内联receive子句并不罕见。

“进程状态”根本不会改变其状态数据 阻塞 - 这意味着它会暂停,直到发生消息或超时。但是,与轮询系统不同,这不会带来开销损失,因为VM正在管理调度(该过程不必自行唤醒,它可以安全地阻止receive)。

你问这是否会成为一个瓶颈:否。没有其他进程阻止,只有这个。所有其他进程都在自己的计划上执行,并且与此计划无关。因此,当阻止接收时,您只会阻止此特定过程应该执行的其余操作。因此,这是否是瓶颈成为一个架构问题。