티스토리 뷰
Node.js로 multi threading, multi processing을 필요로하는 작업을 진행하게 되었다.
Node.js에서 multi threading을 위해서는 worker_thread
(node version 10부터 사용가능)를 사용한다. Multi processing을 위해서는 child_process
또는 cluster
를 사용한다.
process를 단순하게 병렬로 실행하는 것은 child_process
로 가능하고, 로드밸런싱과 포트 공유가 필요하다면 cluster
를 사용하는 것이 좋다.
multi threading과 multi processing 중 선택
multi threading, multi processing을 사용하여 모두 구현은 가능하지만 두가지의 장단점이 다르기 때문에 요구사항에 따라 선택해야 한다.
multi threading을 사용하는 것은 multi processing을 사용하는 것 보다 병렬처리를 가볍게 처리하는 방식이다. memory를 효율적으로 공유하고 적은 공간을 사용할 수 있다. Multi processing으로 구현하는 경우 메모리를 공유할 수 없고 통신(IPC)을 통해 데이터를 주고 받아야 한다.
multi processing은 CPU-intensive한 작업을 처리할 때 선택하는 것이 좋고 multi threading은 I/O-intensive한 작업을 처리할 때 선택하는 것이 좋다.
worker_thread 사용 예시
const { Worker } = require('worker_threads')
const runService = (workerData) => {
return new Promise((resolve, reject) => {
const worker = new Worker(__filename,{ workerData });
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', (code) => {
if (code !== 0)
reject(new Error(`Worker stopped with exit code ${code}`));
})
})
}
const run = async () => {
const result = await runService('test')
}
run().catch(err => console.error(err))
cluster 사용 예시
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// main process가 실행
console.log(`Master ${process.pid} is running`);
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
// worker process가 실행
http.createServer((req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
console.log(`Worker ${process.pid} started`);
}
Javascript 파일을 처음 실행하는 process가 마스터가 된다. 마스터에서는 fork()
메서드를 통해서 새로운 worker를 생성한다.
'develop' 카테고리의 다른 글
3 계층 architecture (0) | 2021.10.29 |
---|---|
AWS KMS (0) | 2021.10.17 |
VPC AWS ElasticSearch Service로 Cognito 인증 접근 (0) | 2021.02.05 |
Airflow 기본 시용법 정리 (0) | 2021.01.22 |
S3 tagging으로 lifecycle 적용하기 (0) | 2020.11.11 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Github Actions
- JavaScript
- Python
- shorten
- pagination
- Develop
- inversify
- typescript
- mongoDB
- Prisma
- graphql
- Neptune
- nltk
- AWS community day seoul
- conventional commit
- Cloudfront
- Cognito
- Lifecycle
- NLP
- aws
- Terraform
- lambda@edge
- Elasticsearch
- nginx
- sementic version
- commit message
- Airflow
- mognodb
- slowquery
- Clickjacking
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함