- vừa được xem lúc

Sự Thật Về Multi-thread Trong Node.js – Không Phải Lúc Nào Cũng Single Thread!

0 0 4

Người đăng: Hoài Long

Theo Viblo Asia

Node.js có phải là single-thread?

Câu trả lời là: Không.

  • – vì event loop của Node.js chạy trên một thread duy nhất.
  • Không – vì Node.js ngầm sử dụng nhiều thread phía sau thông qua thư viện libuv.

Nói cách khác: JavaScript trong Node chạy trên 1 thread, nhưng Node có thể tận dụng đa luồng cho một số tác vụ nặng như I/O, xử lý file, crypto...

Các cách sử dụng đa luồng trong Node.js

1. Worker Threads (Từ Node v10.5 trở lên)

worker_threads cho phép bạn tạo thêm các thread độc lập trong JS để xử lý các tác vụ tính toán nặng.

// main.js
const { Worker } = require('worker_threads'); new Worker('./heavy-task.js');
// heavy-task.js
console.log('Heavy task running in a separate thread!');

Thích hợp cho CPU-bound task như tính toán, xử lý ảnh, mã hóa.

2. Cluster module – scale theo CPU core

Module cluster giúp bạn fork nhiều process Node.js để tận dụng đa nhân CPU. Mỗi process là một instance độc lập.

const cluster = require('cluster');
const http = require('http');
const os = require('os'); if (cluster.isMaster) { const cpuCount = os.cpus().length; for (let i = 0; i < cpuCount; i++) { cluster.fork(); }
} else { http.createServer((req, res) => { res.end('Handled by worker ' + process.pid); }).listen(3000);
}

Dùng để tăng throughput của server HTTP hoặc WebSocket.

3. libuv thread pool (ẩn)

Một số API như fs, crypto,dns.lookup()... thật ra không chạy trong event loop, mà chạy trong thread pool do libuv cung cấp. Ví dụ:

const crypto = require('crypto'); console.time('hash');
crypto.pbkdf2('password', 'salt', 100000, 64, 'sha512', () => { console.timeEnd('hash');
});

Bạn có thể thay đổi số thread trong pool:

process.env.UV_THREADPOOL_SIZE = 8;

Khi nào nên dùng multi-thread?

  • Khi có tác vụ tính toán nặng và blocking (CPU-bound)
  • Khi muốn tăng hiệu suất server bằng cluster
  • Khi muốn tận dụng đa nhân CPU Còn lại, hãy tận dụng event loopnon-blocking I/O – đó mới là sức mạnh gốc của Node.js.

Kết luận

Mặc dù JavaScript trong Node là single-thread, nhưng Node.js không hề đơn giản như bạn tưởng. Nó có thể tận dụng đa luồng cực kỳ linh hoạt với:

  • Worker Threads cho CPU-bound task
  • Cluster để scale server
  • Thread pool của libuv cho một số API

Nếu biết cách dùng hợp lý, bạn có thể “vắt kiệt hiệu năng” từ Node.js mà không cần chuyển sang ngôn ngữ khác.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Hiều về kiến trúc hướng sự kiện của Node.js

Bài viết được dịch từ nguồn. Hầu hết các node objects như HTTP request, HTTP response hay HTTP stream - đều implement EventEmitter module nên chúng đều có thể:.

0 0 34

- vừa được xem lúc

Cách Tạo và Chạy Containers Đơn Giản

Docker: Cách Tạo và Chạy Containers Đơn Giản. Docker đã trở thành một công cụ không thể thiếu cho các nhà phát triển và các nhóm DevOps.

0 0 10

- vừa được xem lúc

Triển khai môi trường phát triển Node.js 18.3 trong 2 phút - triển khai các công cụ chỉ bằng một cú nhấp chuột

ServBay là một công cụ quản lý môi trường phát triển mạnh mẽ hỗ trợ nhiều ngôn ngữ phát triển và cơ sở dữ liệu. Sau đây là các bước chi tiết về cách cài đặt và triển khai Node.

0 0 10

- vừa được xem lúc

Giải Quyết Callback Hell: 3 Cấp Độ Quản Lý Bất Đồng Bộ trong JavaScript

Khi làm việc với các tác vụ bất đồng bộ trong JavaScript, lập trình viên sẽ thường xuyên phải đối mặt với vấn đề xử lý tuần tự các hành động không đồng bộ. Điều này có thể dẫn đến Callback Hell, làm m

0 0 14

- vừa được xem lúc

Cách xử lý nhiều yêu cầu tranh chấp một tài nguyên ở cùng một thời điểm khi scaling Kubernetes Pod

Tôi có một business service (tạm gọi là Service W được viết bằng Nodejs) được subscribe vào keyspace của Redis theo cơ chế pub-sub (đang được serve trên Kubernetes), Service W này hoạt động như một wo

0 0 5

- vừa được xem lúc

Cách nhanh nhất để xây dựng dự án React vào năm 2025 (các công cụ mới nhất)

Vào năm 2025, React tiếp tục dẫn đầu xu hướng phát triển front-end. Với những tiến bộ trong công cụ và công nghệ, việc thiết lập một dự án React đã trở nên hiệu quả và thuận tiện hơn.

0 0 5