Trước hết, tôi khởi động cố gắng hiểu Node.Js. Tôi có hai câu hỏi.
Đơn luồng và vòng lặp sự kiện trong Node.js
Đầu Câu hỏi
Từ the article của Felix, nó nói: "chỉ có thể có một callback bắn cùng một lúc. Cho đến khi gọi lại rằng đã hoàn tất thi công, tất cả các callbacks khác phải chờ đợi trong dòng".
Sau đó, hãy xem xét về đoạn mã sau (sao chép từ nodejs trang web chính thức)
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8124, "127.0.0.1");
Nếu hai yêu cầu của khách hàng được nhận cùng một lúc, nó có nghĩa là công việc sau đây:
- yêu cầu http Đầu tiên sự kiện nhận , Đã nhận được sự kiện yêu cầu thứ hai.
- Ngay khi nhận được sự kiện đầu tiên, chức năng gọi lại cho sự kiện đầu tiên đang thực thi.
- Đồng thời, chức năng gọi lại cho sự kiện thứ hai phải chờ.
Tôi có đúng không? Nếu tôi đúng, cách kiểm soát Node.js nếu có hàng nghìn yêu cầu của khách hàng trong thời gian rất ngắn.
Câu hỏi thứ hai
Thuật ngữ "Vòng lặp sự kiện" chủ yếu được sử dụng trong chủ đề Node.js. Tôi đã hiểu "Event Loop" như sau từ http://www.wisegeek.com/what-is-an-event-loop.htm;
Vòng lặp sự kiện - hoặc vòng lặp chính, là cấu trúc trong các chương trình kiểm soát và gửi các sự kiện sau sự kiện ban đầu.
Sự kiện ban đầu có thể là bất cứ điều gì, bao gồm nhấn một nút trên bàn phím hoặc nhấp vào nút trên chương trình (trong Node.js, tôi cho rằng sự kiện ban đầu là http yêu cầu, truy vấn db hoặc tệp I/O truy cập).
Đây được gọi là vòng lặp, không phải vì vòng kết nối sự kiện và xảy ra liên tục nhưng do vòng lặp chuẩn bị cho sự kiện, kiểm tra sự kiện , gửi sự kiện và lặp lại quá trình này.
Tôi có xung đột về đoạn thứ hai, đặc biệt là cụm từ "lặp lại quá trình này một lần nữa". Tôi chấp nhận rằng mã số http.createServer từ câu hỏi trên hoàn toàn là "vòng lặp sự kiện" bởi vì nó liên tục nghe các sự kiện yêu cầu http.
Nhưng tôi không biết cách xác định mã sau đây cho dù vòng xoay sự kiện hay sự kiện. Nó không lặp lại bất cứ điều gì ngoại trừ chức năng gọi lại được kích hoạt sau khi truy vấn db kết thúc.
database.query("SELECT * FROM table", function(rows) {
var result = rows;
});
Hãy để tôi nghe ý kiến và câu trả lời của bạn.
điều gì sẽ xảy ra nếu 'createServer' có hoạt động gọi lại (không đồng bộ)? Yêu cầu đầu tiên cho phép nói quá trình một số hoạt động đồng bộ kích hoạt gọi lại và ngay lập tức? Và bắt đầu xử lý yêu cầu hai trong khi gọi lại từ yêu cầu đầu tiên vẫn đang chạy? – Manali