2012-01-24 5 views
6

다음 기능이 실행중인 코어에서 차단됩니까?ERLANG 대기() 및 차단

멋진 답변은 erlang 및/또는 cpu의 내부 작업에 대해 자세히 설명합니다.

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

답변

7

그 코드 것이다 블록을 실행하는 과정, 현재 하지 않습니다 블록을 해당 프로세스를 실행하는 스케줄러. 게시 한 코드는 수확량과 같지만 시간 초과가 있습니다.

해당 코어의 Erlang VM 스케줄러는 해당 시간 초과가 시작될 때까지 다른 프로세스를 계속 실행하며 해당 프로세스는 다시 실행되도록 예약됩니다.

+0

NodeJS의'setTimeout'에 해당하는 erlang이 있습니까? 현재 스레드에 대해 비 블로킹입니다. – CMCDragonkai

+0

@CMCDragonkai : 현재 수신을 차단 (시간 초과 여부와 상관없이)하거나 그렇지 않습니다. 타임 아웃을'0'으로 설정하여'receive' 호출 사이에서 작업을 스케줄 할 수 있습니다. 이것은 본질적으로받은 편지함을 확인하고 비어있는 경우 계속 작업하는 것을 의미합니다. 예를 들어 ['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

아무런 문제가 없습니다. 얼랑 특유의 꽤 고전적인 문제 : 타임 아웃은 시스템 클록 인터럽트에서만 발생할 수 있습니다. 위와 같은 대답 : 클럭 인터럽트를 기다리는 동안 프로세스가 차단되고 다른 모든 것은 잘 작동합니다.

프로세스가 대기하는 실제 시간에 대한 또 다른 논의가 있습니다. 정확하게 시간이 아닌 (시스템에 따라 다름)하지만 다른 주제입니다.