2012-01-24 109 views
6

以下功能在其运行核心上是否阻塞?ERLANG等待()并阻止

一个伟大的答案将详细Erlang和/或CPU的内部工作。

wait(Sec) -> 
    receive 
    after (1000 * Sec) -> ok 
    end. 

回答

7

,其执行该代码块的方法,其目前运行该过程不会块的调度器。您发布的代码等于收益率,但超时。

Erlang的虚拟机调度为核心将继续执行其他进程,直到超时火灾和过程将再次调度执行。

+0

有一个Erlang等价的NodeJS的'setTimeout'的?对于当前线程,它是非阻塞的 – CMCDragonkai

+0

@CMCDragonkai:您现在可以阻止接收(有或没有超时),或者您不阻止。通过将超时设置为“0”,您可以在“接收”呼叫之间安排工作。这实际上意味着检查您的收件箱,如果它是空的,继续工作。您还可以使用例如['send_after/3'](http://erlang.org/doc/man/erlang.html#send_after-3)安排更高级的检查。 –

2

简短的回答:这将阻止当前唯一的(轻量级)的过程,并不会阻止所有VM。有关更多详细信息,您必须阅读有关erlang调度程序。很好的描述来自Francesco Cesarini和Simon Thompson的书“Concurent Programming”。

... ...剪断 当一个进程被调度,它被分配一个号码削减† 它被允许执行的,其中一些被减少用于执行每 操作。只要进程进入接收条款 (其中没有任何消息匹配或其减少计数达到 零),它就会被抢占。只要没有被执行的BIF,这 策略导致的处理之间执行 时间收费(但不等于)分配。 ... snip ...

1

没有Erlang特有的,很经典的问题:超时只能发生在系统时钟中断上。与上面相同的答案:该进程被阻塞等待时钟中断,其他一切正常工作。

有一个关于实际时间过程要等待这是不是精确的准确,因为它依赖于时钟周期(而这依赖于系统),但是那是另一个话题另议。