我希望知道此进程运行时的erlang进程状态receive after
:
receive
X ->
ok
after 1000 ->
ok
end
1,进程状态是在运行还是在等待?
2,此过程是否会使用cpu schedler时间?
3,如果我有120000这样的erlang进程,每个进程都将运行如下代码:
receive
X ->
ok
after 1000 ->
ok
end
那么,这段代码是否会成为瓶颈?
答案 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
)。
你问这是否会成为一个瓶颈:否。没有其他进程阻止,只有这个。所有其他进程都在自己的计划上执行,并且与此计划无关。因此,当阻止接收时,您只会阻止此特定过程应该执行的其余操作。因此,这是否是瓶颈成为一个架构问题。