Hiểu single thread Nodejs với 30 dòng code

Nội dung bài viết

Video học lập trình mỗi ngày

Single thread Nodejs sẽ được chứng minh với chỉ 30 dòng code. Bạn sẽ không còn hiểu mập mờ về vấn đề này nữa, đó cũng là một câu hỏi mà nhiều bạn cũng đang thắc mắc.

Single thread Nodejs

Có thể nói đây không phải là bài viết đầu tiên nói về đơn luồng và đa luồng), vì những bài viết trước tips javascript cũng đã nói nhiều về điều này. Ngoài ra, các bạn cũng không nên nhầm lần giữa process và thread. Trong bài viết cũng nói rõ là process là một ngôi nhà, còn thread là các thành viên trong ngôi nhà đó. Và tôi trích một phần giải thích trong bài viết trước:

Nếu ngôi nhà đó mà bạn đang sở hữu, nhưng bạn đang bị FA (cô đơn) và sống một mình thì bạn hiểu điều nay hơn ai hết. Lúc này bạn muốn làm gì bạn muốn và bất cứ khi nào bạn thích, bởi vì không ai khác trong nhà này ngoài bạn. Bạn muốn nhảy với một volume âm nhạc thật to, đi tắm, nấu bếp, nghĩa là một mình bạn không ai làm phiền bạn. Cũng hiểu hôm nay đó là luồng đơn.

Bài viết nên đọc về Nodejs

Node.js Series: Bắt đầu!!!

JavaScript sử dụng đơn luồng lý do tại sao?

Nodejs đã quyết vấn đề kết nối đồng thời cao như thế nào?

Tôi đã hiểu process và thread như thế này?

Giải thích Single thread Nodejs với 30 dòng code

Tạo một đoạn code trong file server.js dưới đây.

const http = require('http')
function wait(millisec) {
    var now = new Date;
    while (new Date - now <= millisec) ;
}
http.createServer((req, res)=> {
    if (req.url === '/') {
        res.writeHead(200, {"Content-Type": 'text/html'});
        res.write('hello')
        res.end()
    }
    if (req.url === '/wait') {
        wait(5000)
        console.log('wait');
        res.writeHead(200, {"Content-Type": 'text/html'});
        res.write('Done>>>wait')
        res.end()
    }
    if (req.url === '/timeout') {
        setTimeout(()=> {
            res.writeHead(200, {"Content-Type": 'text/html'});
            res.write('Done>>>timeout')
            res.end()
        }, 5000)
        console.log('timeout');
    }
}).listen(3000, "127.0.0.1", function() {
    console.log('server start at http://127.0.0.1:3000')
})

Giờ test xem, node server.js. Và run http://localhost:3000. Thì ngay lập tức màn hình xuất hiện hello như hình ảnh dưới đây.


Nhưng khi ta chạy url khác đó là http://localhost:3000/wait thì hàm wait(5000) sẽ làm cho luồng này bị chặn lại, và sẽ render sau 5 giây. Nhưng đồng thời ta chạy http://localhost:3000 thì vẫn là loading. Vì sao? Vì Nodejs là luồng đơn cho nên luồng wait đang chạy thì mọi việc phải chờ thằng này chạy xong đã. Xem hình ảnh?


Vậy bây giờ chúng ta thử chạy http://localhost:3000/timeout thì http://localhost:3000 bị chặn không? Câu trả lời là Không? Vì setTimeout chỉ chạy và chặn trong request đó thôi, các request khác không ảnh hưởng.

Tóm lại các bạn nên copy code và chạy lại xem có đúng là vậy không?

Có thể bạn đã bị missing