서버 개발 시에 Node.js를 사용할 때 스레드를 이용해 사용자의 요청을 동시에 처리할 수 있습니다.
먼저 서버에 대한 기본 코드입니다.
const express = require("express"); const app = express(); app.get("/", (req, res) => { let total = 0; for(let i=0; i<10000000000; i++) { total++; } res.status(200).json({total}); }); app.listen(3000);
웹브라우저에서 localhost:3000으로 접속하면 몇초간 응답이 없다가 결과가 표시됩니다. 이 몇초간의 무응답은 서버의 모든 것들이 이 하나의 클라이언트 요청을 처리하는데 전념한다는 점입니다. 이 몇초간 또 다른 클라이언트의 요청이 들어온다면... 서버는 응답은 커녕 듣지도(listen) 못합니다.
이 문제를 개선하기 위한 코드를 살펴보면.. 먼저 위의 코드를 다음처럼 변경합니다.
const express = require("express"); const app = express(); const { Worker } = require("worker_threads"); app.get("/", (req, res) => { const worker = new Worker("./worker.js"); worker.on("message", (data) => { res.status(200).json({total: data}); }) }); app.listen(3000);
worker_threads라는 모듈을 추가했고 클라이언트 요청에 대한 연산을 worker.js로 분리시켰습니다. worker.js가 바로 스레드가 수행하는 코드이고 완료되면 message라는 이벤트가 호출되어 그 결과가 전달됩니다. worker.js의 코드는 다음과 같습니다.
const { parentPort } = require("worker_threads"); let total = 0; for(let i=0; i<10000000000; i++) { total++; } parentPort.postMessage(total);
무거운 연산이 완료되면 parentPort.postMessage를 통해 결과를 전달합니다.