`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.

我想知道:

  1. timer:sleepsleepingblocking的进程状态?

  2. 对于Erlang VM进程调度,这个实现有什么区别吗?

timer:sleep/1和硬编码的receive...after...end语句没有区别(怎么可能呢?前者是defined,后者是defined)。

此外,根据 process_info/1 的文档,一个进程的 status 可以是:

Status :: exiting
        | garbage_collecting
        | waiting
        | running
        | runnable
        | suspended

在这两种情况下(timerreceive...),过程都是 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}