feat. 2022년도 진행했던 web.dev 스터디의 정리 자료를 뒤늦게 퍼블리시 하다 . .
rust가 지원되지 않는 웹 ide에 rust 컴파일러 플러그인을 추가하게 되며 웹 IDE에서 rust를 최대한 지원하도록 컨트리뷰션 해야할 일이 있었습니다 .
실시간으로 코드를 쓰는 이벤트를 받으면서 어떻게 그 위치와 그 값과 그게 문법적으로 맞는지랑 그걸 어떻게 처리해야 하는 거지? → 이런 경우 문법을 체크하고 그 위치를 계산하고 등등의 작업을 별도의 스레도를 열어서 해야한다는 것을 알게됨!
그래서 찾아보니까 웹데브 사이트가 나왔습니다 ,,, ㅋㅋㅋ 스레드를 열 수 있는 방식이 두 가지가 있다더라구요.
fetch
event와 같은 네트워크 요청을 탈취하거나 push
event와 같은 Push API를 listen 할 수 있다.swfit와 같은 다중 스레드 언어처럼 UI에 관여할 수 있는 스레드는 메인 스레드이기 때문에 스레드 간의 관계가 Flux패턴과 유사
const worker = new Worker("./worker.js");
worker.postMessage([40, 2]);
worker.addEventListener("message", event => {
console.log(event.data);
});
addEventListener("message", event => {
const [a, b] = event.data;
// Do stuff with the message
postMessage(a+b);
});
이 아티클에는 2019년도 기준이라 webpack, rollup 등의 도구들이 즉시 지원하지 않는다고 쓰여있는데 현재 webpack5에서는 굉장히 예쁘고 간결한 방식으로 쓸 수 있게 지원하고 있어요!
const worker = new Worker(new URL('./worker.js', import.meta.url));
worker.postMessage({
question:
'The Answer to the Ultimate Question of Life, The Universe, and Everything.',
});
worker.onmessage = ({ data: { answer } }) => {
console.log(answer);
};
self.onmessage = ({ data: { question } }) => {
self.postMessage({
answer: 42,
});
};
근데 이 방식은 webpack5에서 지원하는 방식이라 webpack4 버전 이하에서는 다른 방식들을 사용해야 한다더라구요 .. 자세한 내용은 여기에 ..
생각보다 저런 모듈 번들러 시스템에서 지원한 지 얼마되지 않았….더라구요
이건 구글 크롬팀에서 만든 라이브러리인데 편하게 웹 작업자를 사용할 수 있도록 한다고 해요. 이 라이브러리를 사용하면 특징에 다른 멀티스레드 언어처럼 웹 작업자랑 메인스레드 간에 변수를 공유할 수 있도록 기능을 제공해준다고 해요.
import {expose} from "comlink";
const api = {
someMethod() { /* … */ }
}
expose(api);
import {wrap} from "comlink";
const worker = new Worker("./worker.js");
const api = wrap(worker);
그런데 사실 이게 단지 에디터 개발에만 쓰이는 것은 아닐테고(좀 너무 특수한 케이스니까..) 이 메인 스레드 외의 웹 워커로 스레드를 돌리는 케이스가 어떤 것이 있을까 왜 이걸 쓰게되었을까..
Chrome Dev Summit 에서 다룬 PROXX 사례에 따르면 …
결론적으로 목표
한 스레드에서 다른 스레드로 데이터를 옮기는 시간이 오브젝트의 복잡도에 따름 ..
10kb보다 더 큰 개체를 복사하는 경우 ArrayBuffer 또는 WebAssembly 사용을 고려하면 좋다고 함!
도대체 어느 시점부터 웹워커가 필요한 것일까 ,,
사실상 이런 병렬처리를 고려할 때 일차적으로는 비동기적인 처리를 고려할텐데 ,,
일단 처음부터 도임하는 경우 아래 정도의 경우들로 정리할 수 있을 것 같다
사실상 그 외의 경우에는 개발하다보니 생기는 메인스레드 UI 병목현상을 해결하기 위해 도입하지 않을까 .. 하는 생각이 들었습니다.
https://chalu.github.io/comlink-workers/src/
https://tech.kakao.com/2021/09/02/web-worker/
https://fe-developers.kakaoent.com/2022/220324-web-worker-image/
https://web.dev/workers-overview/