`receive after` 和 `timer:sleep` 有区别吗?
Is there any difference between `receive after` and `timer:sleep`?
timer:sleep
的实现是:
-spec sleep(Time) -> 'ok' when
Time :: timeout().
sleep(T) ->
receive
after T -> ok
end.
所以timer:sleep
等于这个代码:
receive ->
never_match -> %% note: this never to be matched
ok
after 1000
ok
end.
我想知道:
是timer:sleep
sleeping
或blocking
的进程状态?
对于Erlang VM进程调度,这个实现有什么区别吗?
timer:sleep/1
和硬编码的receive...after...end
语句没有区别(怎么可能呢?前者是defined,后者是defined)。
此外,根据 process_info/1
的文档,一个进程的 status 可以是:
Status :: exiting
| garbage_collecting
| waiting
| running
| runnable
| suspended
在这两种情况下(timer
或 receive...
),过程都是 waiting
。
4> spawn(fun() -> receive after 5000 -> ok end end).
<0.40.0>
5> process_info(v(4), status).
{status,waiting}
6> spawn(fun() -> timer:sleep(5000) end).
<0.43.0>
7> process_info(v(6), status).
{status,waiting}
timer:sleep
的实现是:
-spec sleep(Time) -> 'ok' when
Time :: timeout().
sleep(T) ->
receive
after T -> ok
end.
所以timer:sleep
等于这个代码:
receive ->
never_match -> %% note: this never to be matched
ok
after 1000
ok
end.
我想知道:
是
timer:sleep
sleeping
或blocking
的进程状态?对于Erlang VM进程调度,这个实现有什么区别吗?
timer:sleep/1
和硬编码的receive...after...end
语句没有区别(怎么可能呢?前者是defined,后者是defined)。
此外,根据 process_info/1
的文档,一个进程的 status 可以是:
Status :: exiting
| garbage_collecting
| waiting
| running
| runnable
| suspended
在这两种情况下(timer
或 receive...
),过程都是 waiting
。
4> spawn(fun() -> receive after 5000 -> ok end end).
<0.40.0>
5> process_info(v(4), status).
{status,waiting}
6> spawn(fun() -> timer:sleep(5000) end).
<0.43.0>
7> process_info(v(6), status).
{status,waiting}