2015-11-23 23 views
0

timer:sleep實現是:'receive after`和`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:sleepsleeping或進程狀態blocking

  2. 對於Erlang VM進程調度,這個實現有什麼區別嗎?

回答

5

timer:sleep/1和硬編碼receive...after...end聲明沒有區別(這怎麼可能?前者是defined因爲後者)。

此外,根據的process_info/1文檔,一個進程的狀態可以是:

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} 
+0

for'timer:sleep',erlang vm會使這個過程成爲'hibernate'? – BlackMamba

+0

正如你可以從[code](https://github.com/erlang/otp/blob/738c34d4bb8f1a3811acd00af8c6c12107f8315b/lib/stdlib/src/timer.erl#L150)看到的那樣,因爲沒有調用['erlang :冬眠/ 3'(http://www.erlang.org/doc/man/erlang.html#hibernate-3)。 – aronisstav

相關問題