1.編程語言的每個規則出現,確定是爲了能解決一部分問題,咱們學習編程語言也應該是帶着疑問去學習。編程
爲何會有帶超時的receive,是由於:編程語言
有時若是摸個message遲遲不來,receive就可能進入無限的等待之中。形成這種狀況有幾種緣由。多是某個程序內部邏輯有問題,或者,那個準備發送message的進程在發送Message以前掛掉了。函數
因此,便有了這個帶有超時的receive。這樣就解決了上述問題。學習
2.那麼,這個帶有超時的receive是什麼樣子的進程
以下:it
receiveio
Pattern1 [when Guard1]->程序
Expressions1;im
Pattern2 [when Guard2]->語言
Expressions2;
...
after Time ->
Expressions
end
若是在進入receive的表達式後,在Time所規定的毫秒數內,未接收到可以匹配的消息,那麼進程就會中止等待,並對Expressions進行求值。
3. 瞭解了以上兩點後,咱們就要系統瞭解這個receive超時的類型了
分爲一下幾種:
你能夠寫出一個只有超時的receive語句,使用這個語句,咱們能夠定義一個sleep(T)函數,用它讓當前進程暫停Tms
sleep(T)->
receive
after T ->
true
end.
一個超時時間爲0的語句會當即觸發一個超時,但在此以前,系統會嘗試對郵箱進行模式匹配。咱們能夠用這個特性來定義一個flush_buffer函數,它能夠徹底清空進程郵箱中的全部消息:
flush_buffer()->
receive
_Any ->
flush_buffer()
after 0->
true
end.
若是沒有超時子句,在郵箱爲空的狀況下,flush_buffer會永久暫停,而不會返回,咱們能夠用0超時實現一個「優先接收」的程序:
priority_receive()->
receive
{alarm,X}->
after 0->
receive
Any->
Any
end
end.
若是receive語句的超時值被設定爲原子infinity,那麼系統就永遠不會觸發超時,在那種超時值,其實是有receive之外的其餘語句來決定的程序中。