Đa luồng trong nodejs

Em có tìm và thấy cái này https://nodejs.org/api/worker_threads.html . Nodejs đã hỗ trợ đa luồng phải không ạ. Ví dụ giờ vps của em 2gb ram em lấy 100 row trong db, mỗi row e muốn xử lý cùng lúc 50 thread thì liệu có đủ bộ nhớ để chạy ko ak.

Ai có code example dễ hiểu share cho em demo thì càng tốt ạ, em cảm ơn.

1 Like

Bạn tìm thấy được link đó? Rồi sao nữa?
Câu chữ nào trong cái link trên làm bạn đưa ra phỏng đoán hay ý tưởng trên? Bạn có thể chia sẻ cho mọi người được không?

3 Likes

Hiện tại kiểu code của e là ntn a

conn.query('SELECT data FROM table', async function (err, result) {
    if (err) {
        throw err;
    } else {
        for (data of result) {
            var list = await getData(); // array 50 elems
            for (page of list) {
                var seprateThread = new Worker(__dirname + "/sub.js", {});
                seprateThread.on("message", (response) => {
                   // response from sub.js
                });
                var params = {
                    //params post to sub.js
                };
                seprateThread.postMessage(params);
            }
        }
    }
});

như kia là nó sẽ mở 50 luồng chạy đến file sub.js fai k ak? nhưng em cron để treo chạy nó 1p 1 lần thì nó lag server ý a

Rất vui khi topic này của bạn không phải là hỏi vu vơ
Cùng phân tích vấn đề một tí

khi file sub.js kia trong worker thread chạy xong, nó cho bạn một cái event on message
bạn sẽ làm gì với event đó? 50 cái event đó có sử dụng cùng tài nguyên gì đó hay không? có cần thứ tự không? sau 50 cái event đó thì có cần chốt sổ hay handle sau khi tất cả 50 event chạy xong?

với sức mạnh của máy tính hiện nay, thì 50 thread tác vụ thông thường không phải là vấn đề gì đó ghê gớm lắm, quan trọng vẫn là 50 thread kia bạn làm gì trong đó thôi

Ok, phần đặt vấn đề đã xong, bạn tự trả lời những câu hỏi bên trên để rút ra kết luận, nếu chưa rút ra được kết luận thì hỏi tiếp

Nói về cái link bạn đưa ra một tí

Đây là section đầu tiên của link trên và nó chỉ đứng sau phần mục lúc thôi
nên có thể nói, nếu bạn đọc link trên, thì trên hình là đoạn đầu tiên mà bạn sẽ đọc
Vây đoạn trên nó nói gì?

Workers (threads) are useful for performing CPU-intensive JavaScript operations. They do not help much with I/O-intensive work. The Node.js built-in asynchronous I/O operations are more efficient than Workers can be.

Workers (threads) hữu dụng cho việc sửa dụng tài nguyên tính toán cho cpu, tức là bạn có thể sử dụng nhiều thread để khiến cho cpu nó chạy “điên cuồng” hơn (tất nhiên là trong giới hạn của cpu)
Nhưng, code không phải lúc nào cũng chỉ dùng tài nguyên cpu mà còn nhiều tài nguyên khác nữa, ổ cứng, network, database, bàn phím, ngoại vi…, và các thể loại còn lại đó gọi chung là IO
Và chúng là có câu thứ 2, They do not help much with I/O-intensive work, workers không giúp gì được nhiều khi cho tác vụ IO
The Node.js built-in asynchronous I/O operations are more efficient than Workers can be. vãn là cơ chế async IO sẵn có đã là tốt những gì có thể rồi, bạn không cần phải suy nghĩ gì để tối ưu cái chuyện đó cả

để có thể dẽ hình dung hơn, thì mình có một ví dụ cụ hể như này

A, B cùng mở một cửa hàng làm và bán bánh, A làm shipper (resouce database), B làm đầu bếp (resouce - CPU)

thường thì A nếu giao nhanh thì chỉ cần 5p là có thể giao một đơn hàng
B thì 3p để làm ra một cái bánh
=> trong một giờ có thể làm được 20 bánh, và giao được 12 đơn

câu chuyện sẽ chẳng có gì đáng nói nếu so lương đơn hàng không lớn, tầm 10 đơn/giờ (1 đơn 1 bánh) mỗi giờ
khi đó, trong 1 giờ, A cần giao 10 đơn, B cần làm 10 bánh, cả 2 đều rất thoải mái

Nhưng rồi nhiều người thấy ngon, nên số lượng đơn hàng tăng lên, đến 15 đơn một giờ
lúc này, A phải giao hàng liên tục, và dù có gắng hết sức, nhưng A vẫn chỉ có thể giao được 12 đơn trong một giờ mà thôi, nhưng lúc này làm 15 bánh trong một giờ vẫn là chuyện trong tầm tay của B
vì không thể giao nhiều hơn, nên họ đành từ chối 3 đơn, lúc này thì cái họ thiếu là shipper (databse) chứ không phải thợ làm bánh (CPU)

qua câu chuyện trên, dù thợ làm bánh có làm được 1000 bánh trong 1 giờ thì cũng vô dụng, cũng chỉ có thể bán đợc 12 bánh trong 1 giờ, nên thợ làm bánh cũng chỉ làm đúng số bánh cần giao rồi ngồi đợi shipper mà thôi, rảnh cũng không làm thêm được vì không có đủ resouce shipper

8 Likes

javascript sẽ ko bao giờ có multithread như mấy ngôn ngữ khác. Lý do là nếu bây giờ thêm nó vào thì mấy hệ thống hoặc web app có thể fail :rofl:

2 Likes

nó không hiệu quả như các ngôn ngữ khác ạ

Không rõ có phải ông chủ topic này đang định vắt kiệt tài nguyên server bằng những dòng code hay không. Đừng có nói làm việc liên quan đến MMO và thuê hàng loạt VPS giá rẻ giờ muốn tận dụng tài nguyên… Câu chuyện này làm nhớ trước đây có ông nào đó hỏi có cách nào đang download thì ghi luôn vào đĩa CD thay vì đợi tải xong rồi mới ghi… nó rồi cũng quay lại câu chuyện cửa hàng bánh như @kisuluoibieng đề cập ở trên.

Nên nhớ: con người chỉ làm việc đơn nhiệm => máy tính làm việc đa nhiệm cũng chỉ để quảng cáo cho vui hoặc mấy nhà khoa học cần máy tính khủng xử lý mấy cái phép toán khủng. Người viết code bình thường, cứ lập trình như từng làm lâu nay cho bớt rối não.

5 Likes

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?