Web Workers JavaScript API 소개
웹 노동자 다음과 같은 작업을 수행 할 수있는 자바 스크립트 API입니다. 주 스레드와는 별도의 스레드에서 스크립트를 실행하십시오.. 백그라운드 스크립트와 같이 기본 스크립트를 실행하는 데 방해가되지 않으면 편리하게 사용할 수 있습니다..
웹 근로자 API는 거의 모든 브라우저에서 지원, 자세한 내용은 CanIUse 문서를 참조하십시오. 코드를 작성하기 전에이 API를 사용하여 내가 의미하는 바를 알 수있는 몇 가지 시나리오를 살펴 보겠습니다. 배경 화면 스크립트
.
사용 사례
스크립트가 있다고 가정 해 봅시다. 파일을 가져 와서 처리한다.. 파일이 상당히 큰 경우 처리 시간이 오래 걸립니다! 나중에 실행 된 다른 스크립트를 멈출 수 있습니다..
그러나 파일 처리가 백그라운드 스레드로 이동 됨, 로 알려진 작업자 스레드, 다른 이벤트는 이전 이벤트가 끝날 때까지 차단되지 않습니다..
스크립트 배경 작업자 스레드에서 실행 라고합니다. 작업자 스크립트 또는 노동자.
다른 예를 들어, 큰 형태, 탭으로 배열. 하나의 탭에서 컨트롤을 업데이트하는 방식으로 스크립트되었습니다. 다른 사람의 통제에 영향을 준다..
다른 탭의 업데이트에 약간의 시간이 걸리면 현재 탭을 계속 사용할 수 없습니다. 이벤트가 보류되지 않고 이로 인해 사용자 인터페이스가 정지 될 수 있습니다..
사용자가 현재 탭을 채우는 동안 다른 탭을 보지 않으므로 백그라운드 스레드에서 다른 탭의 컨트롤을 업데이트하십시오.. 이렇게하면 다른 탭의 컨트롤을 업데이트하는 과정에서 스크립트가 차단되지 않고 사용자가 채우고있는 현재 탭을 계속 사용할 수 있습니다..
마찬가지로 스크립트가있는 시나리오를 찾으면 사용자가 사용자 인터페이스를 사용하지 못하도록 차단할 수 있습니다. 실행이 끝날 때까지 백그라운드에서 실행될 수 있도록 작업자 스레드로 이동하는 것을 고려할 수 있습니다.
범위와 노동자 유형
Web Workers API는 아마도 가장 간단한 API 중 하나 일 것입니다. 그것은 매우 간단한 방법을 가지고 있습니다. 작업자 스레드 생성 과 메인 스크립트에서 그들과 대화한다..
작업자 스레드의 전역 범위는 주 스레드와 다른 컨텍스트에 있습니다. 당신 의 메소드 및 속성에 액세스 할 수 없습니다. 창문
목적 와 같은 경보()
작업자 스레드 내부. 너도 DOM을 직접 변경할 수 없다. 작업자 스레드에서.
그러나, 당신은 양철통 다음에 나오는 많은 API를 사용하십시오. 창문
, 예를 들면 약속
과 술책
, 작업자 스레드에서 (전체 목록 참조).
당신은 또한 중첩 된 작업자 스레드: 다른 작업자 스레드에서 생성 된 작업자 스레드. 다른 작업자가 만든 작업자를 a 하위 노동자.
또한있다 많은 유형 노동자. 두 가지 주요 사항은 다음과 같습니다. 헌신적이고 공유 된 노동자들.
전용 근로자 같은 브라우징 컨텍스트에 속한다. 그들의 주 스레드가 속해있다. 그러나 공유 된 근로자들은 다른 브라우징 컨텍스트에있다. (예를 들어, iframe에서) 주 스크립트에서. 두 경우 모두 주 스크립트와 작업자 동일한 도메인에 있어야한다..
이 자습서의 예는 헌신적 인 노동자에 대해, 가장 일반적인 유형.
API 메소드
아래 다이어그램을 참조하십시오. 모든 주요 방법의 빠른 개요 Web Workers API를 구성하는.
그만큼 노동자()
건설자 전용 작업자 스레드를 생성합니다. 과 그것의 참조 객체를 돌려 준다.. 그런 다음이 개체를 사용하여 특정 작업자와 통신합니다..
그만큼 postMessage ()
메소드는 주 스크립트와 작업 스크립트에서 모두 사용됩니다. 서로에게 데이터를 보낸다.. 그러면 전송 된 데이터가 메시지에
이벤트 핸들러.
그만큼 끝내다()
방법 주 스크립트에서 작업자 스레드를 종료합니다.. 이 종료는 즉시의현재 스크립트 실행 및 보류중인 스크립트는 취소됩니다. 그만큼 닫기()
메소드는 똑같은 일을하지만, 작업자 스레드가 스스로를 닫음으로써 호출 됨.
예제 코드
이제 샘플 코드를 살펴 보겠습니다. 그만큼 index.html
페이지에는 메인 스크립트 내부 tag, while the worker script is held in a JavaScript file called
worker.js
.
우리는 주 스크립트에서 작업자 스레드 생성.
w = 새 작업자 ( 'worker.js');
그만큼 노동자()
건설자 작업자 파일의 URL을 인수로 취합니다..
그런 다음에 대한 이벤트 핸들러를 추가합니다. 메시지에
새롭게 작성된 작업 인스턴스의 이벤트 그것으로부터 데이터를 받는다.. 그만큼 데이터
재산 이자형
이벤트는 수신 된 데이터를 보유합니다..
w = 새 작업자 ( 'worker.js'); w.onmessage = (e) => console.log ( '작업자로부터받은 : $ e.data');
이제, 우리는 postMessage ()
에 일부 데이터를 작업자 스레드로 보냄 버튼 하나 클릭. 그만큼 postMessage ()
메소드는 두 개의 인수를 취할 수 있습니다. 첫 번째 유형 (문자열, 배열 ...)이 될 수 있습니다. 그것은 데이터입니다. 작업자 스레드로 보내진다. (또는 메소드가 작업자 스레드에있을 때 주 스크립트로).
두 번째 선택적 매개 변수는 다음과 같은 객체 배열입니다. 작업자 스레드에서 사용할 수 있습니다. (하지만 주 스크립트가 아닌, 또는 그 반대). 이러한 종류의 객체는 양도 가능
사물.
document.querySelector ( 'button'). onclick = () => w.postMessage ( 'john');
난 그냥 작업자 스레드에 문자열 값을 보내는거야.
작업자 스레드에서 메시지에
그 이벤트 핸들러 데이터를받을 것이다. 버튼을 클릭 할 때 주 스크립트에 의해 전송됩니다. 핸들러 내부에서 수신 된 문자열을 다른 문자열과 연결 그 결과를 메인 스크립트로 되돌려 보내라..
console.info ( 'worker created'); onmessage = (e) => postMessage ( '안녕 $ e.data');
우리가 사용해야하는 주요 스크립트와 달리 w
참조 객체 특정 작업 스레드를 참조하십시오. 그 다음에 스크립트는 메시지에
과 postMessage
방법, 거기 작업자 스레드에서 참조 객체 필요 없음 주 스레드를 가리 키도록.
코드는 다음과 같이 작동합니다. 브라우저가로드 될 때 index.html
, 콘솔에 "만든 근로자"
메시지가 노동자()
생성자가 주 스레드에서 실행됩니다., 새로운 노동자 창출.
페이지의 버튼을 클릭하면 "노동자로부터 받음 : 안녕 존"
콘솔에있는 메시지. 작업자 스레드에서 연결됨 데이터가 전송 된 후 메인 스크립트로 되돌아왔다..