웹 워 커 와 JS 의 비동기 프로 그래 밍 비교
7528 단어 전면webworker비동기JavaScript
var t = true;
setTimeout(function(){ t = false; }, 1000);
while(t){ }
alert('end');
상기 코드 는 언제 alert "end" 를 물 었 습 니까? 테스트: 정 답 은 영원히 alert 를 하지 않 는 다 는 것 이다.
해석: 자바 스 크 립 트 엔진 은 단일 스 레 드 입 니 다. 이벤트 트리거 대기 열 입 니 다.모든 임 무 는 촉발 시간 에 따라 선후 로 줄 을 서서 처리한다.
상례 에서 줄 을 서 는 순서 상 태 는:
| var t=true ; | while(t){}; | alert(‘end’); |
1000 ms 이후 setTimeout 함수 도 대열 에 합류 했다. while (t) {} 무한 순환 으로 단일 스 레 드 를 막 았 습 니 다. 뒤쪽 코드 의 실행 시간 이 아무리 짧 아 도 뒤의 코드 는 실행 할 수 없 으 며 계속 막 혔 습 니 다.
브 라 우 저 스 레 드 브 라 우 저 에는 이렇게 많은 스 레 드 가 있 습 니 다.
UI 렌 더 링 스 레 드 (페이지 렌 더 링 에 사용),
javascript 엔진 스 레 드 (js 처리 에 사용),
GUI 이벤트 트리거 스 레 드 (대화 식 으로 사용).
가끔 열 리 는 스 레 드:
http 전송 스 레 드,
정시 트리거 스 레 드 (타이머)
그들 사이 의 관 계 는 무엇 입 니까?
(1) UI 렌 더 링 스 레 드 와 자바 script 엔진 스 레 드 의 상호 배척
javascript 은 페이지 의 DOM 을 조작 할 수 있 기 때문에 UI 렌 더 링 스 레 드 와 javascript 엔진 스 레 드 가 서로 배척 하지 않 으 면 UI 렌 더 링 스 레 드 에서 페이지 렌 더 링 을 하 는 동시에 javascript 엔진 스 레 드 를 DOM 으로 수정 하면 최종 적 으로 DOM 상태 가 일치 하지 않 는 현상 을 초래 할 수 있 습 니 다.따라서 자바 script 엔진 스 레 드 가 실 행 될 때 UI 렌 더 링 스 레 드 는 동결 상태 입 니 다.
(2) javascript 엔진 스 레 드 와 GUI 이벤트 트리거 스 레 드 (대화 용) 비동기
브 라 우 저 는 이벤트 트리거 스 레 드 를 열 고 사용자 동작 을 기다 리 며 이벤트 트리거 스 레 드 는 응답 이벤트 로 해석 되 며 자바 script 엔진 스 레 드 로 이동 하여 줄 을 서서 기다 리 며 자바 script 엔진 의 처 리 를 기다 리 고 있 습 니 다.
(3) javascript 엔진 스 레 드 와 http 전송 스 레 드 비동기
웹 페이지 get, post 등 요청, xhr 비동기 요청 은 http 전송 스 레 드 를 통 해 자바 script 엔진 으로 전송 하여 줄 을 서서 처 리 를 기다 리 고 있 습 니 다.
(4) javascript 엔진 스 레 드 와 정시 트리거 스 레 드 (타이머) 비동기
setTimeout (), setInterval () 은 단독 스 레 드 가 정시 에 스 레 드 를 촉발 하여 자바 script 엔진 으로 전송 하여 줄 을 서서 처 리 를 기다 리 고 있 습 니 다.
위 와 같은 모든 비동기 작업 은 서로 다른 브 라 우 저 할당 스 레 드 가 실 행 됩 니 다. 먼저 실 행 된 것 은 비동기 대기 열 에 넣 고 이벤트 의 폴 링 을 이용 하여 비동기 대기 열 에 있 는 리 셋 함 수 를 실행 합 니 다.
xhr 이 보 는 속임수 입 니 다. 테스트 를 해 보 겠 습 니 다.
클 라 이언 트 js 코드
//jquery ajax , http://localhost:3000/login
$.ajax({
type: "post",
url: "http://localhost:3000/login",
dataType: "json",
data:{ username: username, password: password },
success: function(data){
if(data){
if(data.message=="i202"){
alert(' , ');
window.location.href="login";
}else if(data.message=="i200"){
alert(' ');
window.location.href="index";
}
else{
alert(' ');
window.location.href="login";
}
} else{
}
}
});
//
while(1){}
백 엔 드 Node. js 코드:// post
router.post('/login', function (req, res, next) {
sleep(1000);
res.send({status:"success", message:"i200"});
});
/**
* sleep
* @param sleepTime
*/
function sleep(sleepTime) {
for(var start = +new Date; +new Date - start <= sleepTime; ) { }
}
프론트 데스크 는 영원히 alert ("로그 인 성공") 하지 않 습 니 다.브 라 우 저 는 http 스 레 드 를 통 해 xhr 응답 을 받 았 으 나 자바 script 스 레 드 로 이동 하여 실행 을 기다 리 고 있 습 니 다.javascript 단일 스 레 드, 한 번 에 하나의 작업 만 처리 할 수 있 습 니 다.첫 번 째 임 무 는 무한 순환 으로 뒤의 임 무 는 모두 막 혔 다.xhr 비동기 프로 그래 밍 은 사실상 일종 의 속임수 이다.
타이머 시간 불허
setTimeout(function () { while (true) { } }, 1000);
setTimeout(function () { alert('end 2'); }, 2000);
setTimeout(function () { alert('end 1'); }, 100);
alert('end');
이 코드 를 실행 합 니 다.실행 결 과 는 alert (end) alert (end 1) 입 니 다.앞의 두 타 이 머 는 약속 한 시간 에 실행 할 수 없습니다.
(2) 시간 불허 2
setTimeout(function(){
/* ... */
setTimeout(arguments.callee, 10);
}, 10);
setInterval(function(){
/* ... */
}, 10);
두 개의 타이머 가 같은 기능 을 실현 하려 고 했 는데 10 초 에 한 번 씩 타 이 머 를 터치 합 니 다.그러나 실제로 setTimeout 은 10ms 후에 야 js 실행 대기 열 에 가입 하여 줄 을 서서 기 다 렸 다.따라서 두 번 의 타이머 가 촉발 하 는 시간 간격 은 > 10ms 일 수 있 습 니 다.
setInterval 은 10s 마다 js 실행 대기 열 에 setInterval 이 벤트 를 추가 하여 실행 을 기다 리 고 있 습 니 다.앞의 setInterval 사건 은 이전의 사건 에 의 해 막 혀 서 몇 박자 늦게 실 행 될 수 있 습 니 다.그러면 두 번 의 정시 시간 이 촉발 되 지 않 은 시간 간격 은 < 10ms 일 수 있 습 니 다.
웹 워 커 야 말로 진정한 다 중 스 레 드 입 니 다. 테스트 해 보 세 요.
index.html
<script src="js/Fthread.js"/>
</code></pre>Fthread.js
<br/>
<pre><code>// webworker
var worker=new Worker('js/Sthread.js');//
// data
worker.onmessage = function(event) {
console.log(event.data);
};
//
worker.postMessage("begin");
//
//setTimeout(function () { while (true) { } }, 1000); </code></pre>Sthread.js
<br/>
<pre><code>// ,
postMessage('hello');
// ,
setTimeout(function () { console.log('end 2'); }, 2000);
setTimeout(function () { console.log('end 1'); }, 100);
worker.onmessage = function(event) {
console.log(event.data);
};
console.log('end');</code></pre> :
<br/>
<pre><code>end
hello // , end1 end2
begin
end1
end2</code></pre>hello , 。 。JS , , 。
<br/>
<br/>webworker , C++ 、 ,Web Worker :
<br/>
<ul>
<li> </li>
<li> DOM </li>
<li> </li>
</ul> web worker ( ), , , Transferable , , , , , , 。
<br/> worker :
<br/>
<ul>
<li> (Ajax、Web Sockets)</li>
<li> (set/clearTimeout()、set/clearInterval())</li>
<li> (navigator、location、JSON、applicationCache)</li>
<li> importScrips() js </li>
</ul>Web worker web worker( , ), web worker( ), web worker 。
<br/> web worker :
<br/>1、 worker
<br/>
<pre><code>var worker = new SharedWorker('scripts/worker.js');</code></pre>2、 ( , )
<br/>
<pre><code>//demo.js
var worker = new SharedWorker('scripts/worker.js');
worker.port.addEventListener('message', function(e){
console.log(e.data); // 500000000067109000
}, false);
worker.port.start(); // web worker, </code></pre>3、worker
<br/>
<pre><code>//worker.js
function calculate(){
var ret = 0;
for(var i = 1; i <= 1e9; i++){
ret += i;
}
return ret;
}
addEventListener('connect', function(e){
var port = e.ports[0]; // ,
port.start();
port.postMessage(calculate());
});</code></pre>4、 web worker ,
<br/>
<pre><code>//
worker.terminate();
//
close();</code></pre>
<br/> http://www.cnblogs.com/heshan1992/p/6698069.html
</div>
</div>
</div>
</div>
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
라이브러리 없이 JWT 토큰 클레임 읽기웹 앱 작업을 하는 거의 모든 사람은 JWT(JSON 웹 토큰)가 무엇인지 알고 있습니다. 그들은 꽤 인기가 있으며 현재 널리 사용됩니다. 세부 사항으로 이동하지 않고(예: 에서 읽을 수 있음) JWT는 점으로 구분...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.