Web Workers는 HTML5에서 제공하는 자바스크립트 멀티스레딩 솔루션입니다. 계산 집약적인 일부 코드를 웹 작업자에게 넘겨 사용자 인터페이스를 중단하지 않고 실행할 수 있습니다.
1: 작업자 사용 방법
Web Worker의 기본 원리는 Worker 클래스를 사용하여 현재 javascript의 메인 스레드에 javascript 파일을 로드하여 새로운 스레드를 여는 것인데, 이는 논블로킹 실행 효과가 있고 메인 스레드와 메인 스레드 사이에 데이터를 제공하는 것입니다. 새로운 스레드 교환된 인터페이스: postMessage, onmessage.
사용 방법에 대한 예를 살펴보겠습니다.
HTML 페이지: test.html
Chrome 브라우저로 test.html을 열면 콘솔에 "hello world"가 출력되어 프로그램 실행이 성공했음을 나타냅니다.
이 예를 통해 Web Worker의 사용은 크게 다음과 같은 부분으로 나누어져 있음을 알 수 있습니다
WEB 메인 스레드:
1. 작업자 = 새 작업자( url )를 통해 JS 파일을 로드하여 작업자를 생성하고 작업자 인스턴스를 반환합니다.
2. 작업자.postMessage(data) 메서드를 통해 작업자에게 데이터를 보냅니다.
3. 작업자가 보낸 데이터를 받기 위해 작업자.onmessage 메서드를 바인딩합니다.
4. Worker.terminate()를 사용하여 작업자 실행을 종료할 수 있습니다.
작업자 새 스레드:
1. postMessage(data) 메소드를 통해 메인 스레드에 데이터를 보냅니다.
2. 메인 스레드에서 보낸 데이터를 수신하기 위해 onmessage 메소드를 바인딩합니다.
2: 근로자가 할 수 있는 일
이제 Web Worker 사용법을 알았으니, 그 용도는 무엇이며 어떤 문제를 해결하는 데 도움이 될까요? 피보나치 수열의 예를 살펴보겠습니다.
수학에서 피보나치 수열은 F0=0, F1=1, Fn=F(n-1) F(n-2) (n>=2, n∈N* ), 일반적인 자바스크립트 구현은 다음과 같습니다.
JavaScript는 단일 스레드에서 실행되기 때문에 시퀀스를 계산하는 과정에서 브라우저는 다른 JavaScript 스크립트를 실행할 수 없으며 UI 렌더링 스레드도 일시 중지되어 브라우저가 좀비 상태에 들어가게 됩니다. 웹 작업자를 사용하여 시퀀스의 계산 프로세스를 새 스레드에 넣으면 이러한 상황을 피할 수 있습니다. 구체적인 예를 참조하세요.
재Chrome中打开fibonacci.html,控system台得到如下输流:
开始计算:40 时间:1316508212705
我䮡算数列的时候执行了 时间:1316508212734
정정时器
하단 화면에는 웹 작업자를 위한 웹 작업자의 중앙 이미지가 있습니다.
http://nerget.com/rayjs-mt/rayjs.html 3:Worker的其他尝试
我们已经知道Worker통신은 URL来创建一个worker,那么我们是否可以利사용웹 작업자来做一些类似jsonp的请求呢,大家道jsonp是일반적인 스크립트标签来加载json数据的,而script元素재加载와 执行过程中道是阻塞式的,如果能利用웹 작업자实现异步加载将会不常不错。
HTML 페이지:/aj/webWorker/worker.html
设置HOST
通过 http://js.wcdn.cn/aj/webWorker/worker.html 访问页face然后分别通过三种方式加载数据,得到控 제조사台输출:
여러 번 시도한 결과 jsonp와 ajax를 통해 데이터를 로드하는 시간은 크게 다르지 않으며 Web Worker의 로딩 시간은 항상 높은 수준이어서 Web Worker를 사용하여 데이터를 로드하는 것은 여전히 상대적입니다. 느리고, 데이터 양이 많아도 장점이 없습니다. Worker가 새 스레드를 초기화하는 데 시간이 걸릴 수 있습니다. 로딩 중 논블로킹이 되는 것 외에는 장점이 없습니다.
그러면 웹 작업자가 도메인 간 js 로딩을 지원할 수 있습니까? 이번에는 http://127.0.0.1/aj/webWorker/worker.html을 통해 페이지에 액세스합니다. "웹 작업자 로딩" 로딩 버튼을 클릭하면 Chrome이 다운로드 응답이 없으며 FF6에서 오류 메시지가 나타납니다. 이를 통해 우리는 웹 작업자가 JS의 도메인 간 로딩을 지원하지 않는다는 것을 알 수 있습니다. 이는 정적 파일을 별도의 정적 서버에 배포하는 웹 사이트에 나쁜 소식입니다.
따라서 Web Worker는 동일한 도메인에서 json 데이터를 로드하는 데만 사용할 수 있지만 ajax는 이미 이 작업을 수행할 수 있으며 더 효율적이고 다재다능합니다. 작업자가 잘하는 일을 하게 하세요.
4: 요약
웹 작업자는 겉으로는 멋져 보이지만 악마로 가득 차 있습니다.
우리가 할 수 있는 일:
1. JS를 로드하여 메인 프로세스를 중단하지 않고도 수많은 복잡한 계산을 수행하고 postMessage, onmessage를 통해 통신할 수 있습니다
2. importScripts(url)을 통해 워커에 추가 스크립트 파일을 로드할 수 있습니다
3. setTimeout(),clearTimeout(), setInterval(),clearInterval()을 사용할 수 있습니다
4. XMLHttpRequest를 사용하여 요청을 보낼 수 있습니다
5. 네비게이터의 일부 속성에 액세스할 수 있습니다
제한 사항은 무엇입니까?
1. 도메인 간 JS를 로드할 수 없습니다
2. 워커 내의 코드는 DOM에 접근할 수 없습니다
3. 다양한 브라우저에서 Worker 구현이 일관되지 않습니다. 예를 들어 FF에서는 작업자에서 새 작업자 생성을 허용하지만 Chrome에서는 허용하지 않습니다.
4. 모든 브라우저가 이 새로운 기능을 지원하는 것은 아닙니다