최근에 저는 웹 워커에 대해 고민하고 있는데, 이것은 웹 워커 사용을 시작하기 위해 알아야 할 모든 것에 대한 포괄적인 가이드입니다.
블로그 읽기를 건너뛰고 대신 코드를 체크아웃하려면 모든 스니펫이 포함된 github 저장소를 참조하세요.
Github 웹 작업자 저장소
그래서 제가 Web Worker를 탐색하게 된 이유는 플랫폼에서 계산량이 많은 작업을 구축하고 있는데 UI가 차단된다는 점이었습니다.
그래서 '어, 알았어, UI를 가리지 않게 하려면 어떻게 해야 하지?'라고 생각했어요. setTimeout을 사용하여 메인 스레드의 모든 코드가 실행을 완료했는지 확인한 후 계산량이 많은 작업을 실행할 수 있나요?
여기에는 오해가 있습니다. setTimeout을 사용한다고 해서 UI가 차단되지 않는다는 의미는 아닙니다. 예, 메인 스레드의 모든 것은 setTimeout 콜백이 실행되기 전에 실행됩니다. 그러나 이 콜백은 매크로 작업 큐에서 팝업될 때 메인 스레드 자체에서 실행되므로 UI가 응답하지 않게 됩니다.
setTimeout의 작동 방식에 대한 자세한 내용은 여기를 참고하세요 —
JavaScript는 본질적으로 '단일 스레드 언어'이지만 웹 워커를 사용하면 계산량이 많은 코드를 별도의 스레드에서 실행할 수 있습니다.
시작하기 전에 몇 가지 참고할 사항이 있습니다.
const worker = new Worker("./worker.js")
참고: Worker.js는 모듈이 아니므로 import 문을 사용할 수 없습니다. 아직. :')
worker.js를 모듈로 사용하려면 생성자의 옵션에 type: module을 지정하세요.
const worker = new Worker("./worker.js")
const worker = new Worker('./worker.js', { type: 'module' })
모두 합치기
이제 웹 작업자를 통합한 후 코드가 어떻게 보이는지 살펴보겠습니다.
메인 스레드 코드:
worker.terminate()
작업자 스레드 코드:
// ... function workerFunction() { // Don't spin up a new worker instance if the process has already been started. if (statusElement.textContent !== PROCESS_STATUS.PROCESSING && window.Worker) { const worker = new Worker('./worker.js', { type: 'module' }) // Sending 10000000000000 to the web worker worker.postMessage(10000000000000) statusElement.textContent = PROCESS_STATUS.PROCESSING // This piece of code is executed after worker finishes its task and returns data. worker.onmessage = function (event) { statusElement.textContent = event.data } } } // ...
결과는 다음과 같습니다.
애플리케이션을 실행하면 UI를 차단하지 않고 계산량이 많은 작업이 실행되는 것을 확인할 수 있습니다.
Comlink는 작은 라이브러리(1.1kB)로 postMessage 로직에 대한 사고의 정신적 장벽을 제거합니다.
더 추상적인 수준에서는 postMessage 및 ES6 프록시에 대한 RPC 구현입니다.
Comlink를 사용한 구체적인 이유는 일반 JavaScript를 사용하여 메인 스레드에서 워커로 함수를 전달할 수 없었기 때문입니다. Comlink의 프록시를 사용하여 메인 스레드에서 워커로 콜백 함수를 쉽게 전달할 수 있었습니다. [이 부분을 참고하세요]
프로젝트에서 comlink 사용을 시작하려면 라이브러리를 설치하세요
const worker = new Worker("./worker.js")
이 라이브러리를 시작하려면 다음 방법에 대해 알아야 합니다.
Comlink.wrap(엔드포인트)
const worker = new Worker('./worker.js', { type: 'module' })
Comlink.expose(값, 엔드포인트?, allowedOrigins?)
worker.terminate()
추가 자료
위 내용은 시작하기 위해 웹 작업자에 대해 알아야 할 모든 것.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!