ERLANG等待()和阻塞

bqucvtff  于 2022-12-16  发布在  Erlang
关注(0)|答案(3)|浏览(195)

下面的函数是否在其运行内核上阻塞?

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

一个很好的答案将详细说明Erlang和/或CPU的内部工作。

ldxq2e6h

ldxq2e6h1#

执行该代码的进程 * 将 * 阻塞,当前运行该进程的调度程序 * 将不会 * 阻塞。您发布的代码等于一个yield,但有一个超时。
该内核的ErlangVM调度程序将继续执行其他进程,直到超时触发,并且该进程将被调度再次执行。

djmepvbi

djmepvbi2#

简短回答:这将只阻塞当前(轻量级)进程,而不会阻塞所有VM。2要了解更多细节,你必须阅读关于Erlang调度程序的文章。3很好的描述来自Francesco Cesarini和Simon Thompson的书“并发编程”。
... snip ...当一个进程被分派时,它被分配了一个允许执行的归约数†,这个数随着每一个操作的执行而减少。一旦进程进入一个接收子句,其中没有一个消息匹配,或者它的归约计数达到零,它就被抢占。只要BIF没有被执行,这种策略导致在进程之间公平(但不相等)分配执行时间。

yc0p9oo0

yc0p9oo03#

没有Erlang特有的,非常经典的问题:超时只能在系统时钟中断时发生。2答案同上:该进程被阻塞,等待时钟中断,其他一切都工作得很好。
还有一个关于进程等待的实际时间的讨论,这个时间并不精确,因为它取决于时钟周期(这取决于系统),但这是另一个主题。

相关问题