以下功能在其運行核心上是否阻塞?ERLANG等待()並阻止
一個偉大的答案將詳細Erlang和/或CPU的內部工作。
wait(Sec) ->
receive
after (1000 * Sec) -> ok
end.
以下功能在其運行核心上是否阻塞?ERLANG等待()並阻止
一個偉大的答案將詳細Erlang和/或CPU的內部工作。
wait(Sec) ->
receive
after (1000 * Sec) -> ok
end.
,其執行該代碼將塊的方法,其目前運行該過程不會塊的調度器。您發佈的代碼等於收益率,但超時。
Erlang的虛擬機調度爲核心將繼續執行其他進程,直到超時火災和過程將再次調度執行。
簡短的回答:這將阻止當前唯一的(輕量級)的過程,並不會阻止所有VM。有關更多詳細信息,您必須閱讀有關erlang調度程序。很好的描述來自Francesco Cesarini和Simon Thompson的書「Concurent Programming」。
... ...剪斷 當一個進程被調度,它被分配一個號碼削減† 它被允許執行的,其中一些被減少用於執行每 操作。只要進程進入接收條款 (其中沒有任何消息匹配或其減少計數達到 零),它就會被搶佔。只要沒有被執行的BIF,這 策略導致的處理之間執行 時間收費(但不等於)分配。 ... snip ...
沒有Erlang特有的,很經典的問題:超時只能發生在系統時鐘中斷上。與上面相同的答案:該進程被阻塞等待時鐘中斷,其他一切正常工作。
有一個關於實際時間過程要等待這是不是精確的準確,因爲它依賴於時鐘週期(而這依賴於系統),但是那是另一個話題另議。
有一個Erlang等價的NodeJS的'setTimeout'的?對於當前線程,它是非阻塞的 – CMCDragonkai
@CMCDragonkai:您現在可以阻止接收(有或沒有超時),或者您不阻止。通過將超時設置爲「0」,您可以在「接收」呼叫之間安排工作。這實際上意味着檢查您的收件箱,如果它是空的,繼續工作。您還可以使用例如['send_after/3'](http://erlang.org/doc/man/erlang.html#send_after-3)安排更高級的檢查。 –