*Reference:
https://developer.mozilla.org/ko/docs/Web/API/Web_Workers_API
Web Worker API
์นํ์ด์ง์์ ์คํ์ค์ธ ์ฃผ ์ค๋ ๋์ ๋ณ๊ฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๋ ๊ธฐ์
๋ณ๊ฐ์ ์ค๋ ๋์์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก ๋ฌด๊ฑฐ์ด ์์ ์ผ๋ก ์ธํ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ง์ฐ ๋ฑ์ ๋ฐฉ์งํ ์ ์์.
*์ฃผ์
1) window์ ์ผ๋ถ ๋ฉ์๋ ์ฌ์ฉ ๋ถ๊ฐ (https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Functions_and_classes_available_to_workers)
2) DOM์ ์์ปค ๋ด์์ ์ง์ ์กฐ์ ๋ถ๊ฐ
์ฌ์ฉ
์์ปค์ ์ข ๋ฅ๋ 2๊ฐ์ง๋ก ๋๋์ด์ง๋๋ค. ๋ง์ฝ ์์ปค๊ฐ ํ๋์ ์คํฌ๋ฆฝํธ์์๋ง ์ฐ์ธ๋ค๋ฉด, ์ ์ฉ์์ปค๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. ์ ์ฉ์์ปค๋ ์๋์ ๊ฐ์ด ์ ์ํฉ๋๋ค:
const myWorker = new Worker(workerRoute)
๋ง์ฝ ์์ปค๊ฐ ํ๋์ ์คํฌ๋ฆฝํธ๊ฐ ์๋ 2๊ฐ ์ด์์ ์คํฌ๋ฆฝํธ์์ ์ฐ์ธ๋ค๋ฉด, ๊ณต์ ์์ปค๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
๊ณต์ ์์ปค๋ ์๋์ ๊ฐ์ด ์ ์ํฉ๋๋ค:
const myWorker = new SharedWorker(workerRoute)
1. ์ ์ฉ์์ปค: ๋ฉ์ธ-์์ปค๊ฐ ํต์
* ํธ์๋ฅผ ์ํด ์์ปค๊ฐ ์์ปค๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ง ์์. ์์ปค๊ฐ ์์ปค๋ฅผ ํธ์ถํ๋๊ฒฝ์ฐ, ์ค๋ ๋๊ฐ ์ดํด๊ด๊ณ๊ฐ ๋ฉ์ธ์ค๋ ๋์์ ๋ถ๋ชจ์ค๋ ๋๋ก ์นํ๋จ.
์ ์ฉ์์ปค์์ ๋ฉ์ธ์ง๋ฅผ ์ ์กํ ๋๋ postMessage() ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฐ์ ์ฌ๋ฌ๊ฐ ๋ณด๋ธ๋ค๋ฉด, ๋ฐฐ์ด๋ก ๋ณด๋ด์ผํฉ๋๋ค.
myWorker.postMessage(values)
๋ณด๋ธ ๋ฉ์ธ์ง๋ฅผ ์์ปค ์์์ ๋ฐ๊ธฐ ์ํด์๋ onmessage๋ฅผ ํตํด ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ๊ณ , ํธ๋ค๋ฌ ์์ e.data์์ ๋ฐ์ ์ ์์ต๋๋ค.
onmessage = function(e) {
const { data } = e;
}
๋ฐ๋๋ก ์์ปค์์ ๋ฉ์ธ์ค๋ ๋๋ก ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ผ๋๋ postMessage() ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
postMessage(message);
๋ฉ์ธ ์ค๋ ๋์์ ์์ปค์ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ ๋๋ myWorker.onmessage์ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค. ๋ฉ์ธ์ง๋ ๋์ผํ๊ฒ e.data์ ์์ต๋๋ค.
myWorker.onmessage = function(e) {
const { data } = e;
}
2. ์ ์ฉ์์ปค: ์์ปค ์ญ์
๋ฉ์ธ์ค๋ ๋์์ ์์ปค๋ฅผ ์ญ์ ํ ๋๋ worker.terminate() ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
myWorker.terminate();
์์ปค ์์์ ์๊ธฐ ์์ ์ ์ญ์ ํ ๋๋ close() ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
close();
3. ๊ณต์ ์์ปค: ์์ปค๊ฐ ํต์
* ์ฌ๊ธฐ๋ถํฐ๋ ๋ถ๋ชจ-์์ ์ค๋ ๋๋ฅผ ๊ณ ๋ คํ์ฌ ์ค๋ช ํฉ๋๋ค.
๊ณต์ ์์ปค๋ ์ ์ฉ์์ปค์ ๋ฌ๋ฆฌ ํต์ ์ ์ํด port ๊ฐ์ฒด๋ฅผ ํต๊ณผํด์ผ๋ง ํฉ๋๋ค. port์ ์ฐ๊ฒฐ์ start() ๋ฉ์๋๋ฅผ ํตํด ์์๋๋ฉฐ, ๋ฐ๋์ ์ฐ์ ์คํ๋์ด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ ๋ชจ๋ ํธ์ถ์ port ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฉ์๋๋ฅผ ํตํด ํธ์ถํ๋ฉฐ, ์ด๊ฒ ์ด์ธ์ ๋ค๋ฅธ์ ์ ์์ต๋๋ค.
๊ฐ๋ น ์ ์ฉ์์ปค์์ onmessage๋ก ์ฌ์ฉ๋์๋ ๊ฒ์ port.onmessage๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ ์ฉ์ฌํญ์ ๋ถ๋ชจ์ค๋ ๋์ ์์์ค๋ ๋์ ๋ชจ๋ ์ ์ฉ๋ฉ๋๋ค.
port์ ์ฐ๊ฒฐ์ 2๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค.
๋ง์ฝ onmessage ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํตํด ์ด ์์ปค๊ฐ ์คํ๋๋ค๋ฉด ์ฐ๊ฒฐ์ ์๋ฌต์ ์ผ๋ก ์์๋๊ธฐ๋๋ฌธ์ ๋์ด์ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ต๋๋ค.
ํ์ง๋ง ๋ง์ฝ addEventListener() ๋ฉ์๋์ ์ฐ๊ด๋์ด ๋ฉ์ธ์ง ์ด๋ฒคํธ๊ฐ ํธ์ถ๋๋ค๋ฉด start() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค.
start() ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค:
๋ถ๋ชจ ์ค๋ ๋์์:
myWorker.port.start();
์์ ์ค๋ ๋์์ (=์์ปค ์์์):
port.start();
'๐จ Dev_FE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ CSS ] CSS ๋ชจ๋ฐ์ผ Transition ๊ฐ์ (0) | 2022.02.13 |
---|---|
[ JS ] ๋ฌธ์์ด๋ด์ ํน์ ๋ฌธ์์ด ๋ชจ๋ ๋์นํ๊ธฐ (0) | 2022.01.25 |
[ JS ] 1. ์ปดํ์ผ (0) | 2021.08.28 |