Erlang中帶超時的receive

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

    你能夠寫出一個只有超時的receive語句,使用這個語句,咱們能夠定義一個sleep(T)函數,用它讓當前進程暫停Tms

    sleep(T)->

        receive

      after T ->

        true

      end.

  • 超時時間爲0的receive

  一個超時時間爲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之外的其餘語句來決定的程序中。

相關文章
相關標籤/搜索