ERLANG wait () и блокировка - PullRequest
       4

ERLANG wait () и блокировка

6 голосов
/ 24 января 2012

Блокирует ли следующий функциональный блок работающее ядро?

Отличный ответ подробно расскажет о внутренней работе erlang и / или процессора.

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

Ответы [ 3 ]

7 голосов
/ 24 января 2012

Процесс, который выполняет этот код , будет блокироваться, планировщик, который в данный момент запускает этот процесс, не будет блокировать.Размещенный вами код соответствует выходу, но с таймаутом.

Планировщик виртуальной машины Erlang для этого ядра будет продолжать выполнять другие процессы до тех пор, пока не сработает тайм-аут, и этот процесс будет снова запланирован для выполнения.

2 голосов
/ 24 января 2012

Краткий ответ: это заблокирует только текущий (легкий) процесс и не заблокирует все виртуальные машины.Для более подробной информации вы должны прочитать о планировщике Erlang.Хорошее описание взято из книги "Concurent Programming" Франческо Чезарини и Саймона Томпсона.

... snip ... Когда процесс отправляется, ему присваивается ряд сокращений † ему разрешеноexecute, число, которое уменьшается для каждой выполняемой операции.Как только процесс входит в условие получения, где ни одно из сообщений не совпадает, или число сокращений достигает нуля, оно прерывается.Пока BIF не выполняются, эта стратегия приводит к справедливому (но не равному) распределению времени выполнения между процессами.... snip ...

1 голос
/ 20 января 2015

ничего, специфичная для Erlang, довольно классическая проблема: таймауты могут происходить только при прерывании системных часов. Ответ тот же, что и выше: этот процесс заблокирован в ожидании прерывания часов, все остальное работает нормально.

Существует еще одна дискуссия о фактическом времени, в течение которого процесс будет ждать, который не настолько точен, потому что он зависит от периода времени (и это зависит от системы), но это другая тема.

...