2013-08-21 3 views
1

여러 개의 "서버"가 비동기 적으로 처리 할 큐를 JavaScript로 작성하고 있습니다. 두 서버가 같은 항목을 대기열에서 검색 할 수도 있습니다. 그것은 지금 일어나고있는 것처럼 보이지 않지만 나는 우연히 그것을두고 싶지 않습니다. 필자가 알고 있듯이 JavaScript는 단일 스레드입니다. 그렇다고해서 동시에 여러 요청이있을지라도 JavaScript는 자체 큐를 사용하여 함수를 실행한다는 가정을 허용합니까? 여기 여러 개의 비동기 호출로 큐 관리

function getJob() { 
    if(jobs.length > 0) { 
     var job = jobs.shift(); 
     $('#jobStatsQueueCount').text(jobs.length); 
     return job; 
    } else { 
     return null; 
    } 
} 

는 전체 코드입니다 :

http://jsfiddle.net/L7yaB/5/

답변

0

자바 스크립트가 단일 스레드입니다; 컴퓨터 땅에 존재하지 않는 "동시에"동시에

에서 여러 요청이있을 것이다에도 불구하고 가정을 허용하는 않습니다. 항상 어떤 명령이 있습니다.

두 번 클릭하면 두 차례의 onclick 이벤트가 차례로 발생합니다. 클릭하는 동안 브라우저가 사용 중이더라도 계속해서 차례대로 진행되며 같은 순서로 브라우저를 해고합니다. 이것은 당신이 생각할 수있는 것입니다 : 이벤트는 서로 경주하거나 추월하거나 삽입하지 않습니다.

이벤트 인터리빙이 없으므로 shift이 원자가 아닌 경우에도 제안하는 것과 같은 일반적인 스레딩 버그가 발생할 위험이 없습니다 (아마 그렇지는 않지만, t 문제).

+0

사실이 시나리오는 어떤 작업입니까? 서버 (1)는 하나의 작업이 있다고 결정한다; 서버 2는 하나의 작업이 있다고 결정하고 서버 1은 작업을 검색 한 다음 이미 검사를 통과 한 서버 2는 작업이 없어지기 때문에 실패합니다. – scader

+0

... 또는 서버 2의 getJob 실행은 서버 1의 실행이 완료 될 때까지 발생하지 않는다고 말하고 있습니까? – scader

+0

... 또는 전체 코드를 살펴보면 자바 스크립트가 이미 실행중인 간격 이벤트를 완료 할 때까지 모든 서버의 간격 이벤트가 실행되지 않습니다. – scader