2011-10-08 25 views
36

Vì nhiều tập lệnh node.js tuân theo mẫu làm việc không đồng bộ (ví dụ bên dưới), làm cách nào để biết khi nào nên dừng?Quy trình node.js biết khi nào nên dừng?

Trong đoạn mã sau, nút xác định như thế nào sau khi xử lý writeFile và đăng ký cuộc gọi lại một cách thích hợp, quá trình đó phải được giữ nguyên cho đến khi (các) cuộc gọi lại chạy?

fs = require('fs'); 

fs.writeFile('foo', 'cat', function() { 
    console.log('wrote to foo!'); 
    fs.readFile('foo', 'utf8', function(err, data) { 
    console.log(data); 
    }); 
}); 

Trả lời

40

nút theo dõi tất cả yêu cầu công việc chưa xử lý. Cuộc gọi fs.writefile() của bạn tạo yêu cầu công việc cho I/O và thêm gọi lại của bạn vào yêu cầu đó. nút lưu yêu cầu công việc vào các bảng của nó cùng một lúc nó bắt đầu hoạt động I/O. Việc thực thi mã của bạn sẽ thoát khi bạn kết thúc chức năng của mình. (Nhưng bộ nhớ của bạn/biến/etc vẫn còn)

Sau đó, kết thúc I/O và nút lấy yêu cầu công việc ra khỏi các bảng của nó. Nó thấy gọi lại gắn liền với yêu cầu và các cuộc gọi có chức năng với kết quả của yêu cầu I/O. Dữ liệu toàn cầu của bạn vẫn còn xung quanh và bất kỳ biến nào trong các bao đóng vẫn tồn tại, vì vậy dường như mã của bạn giống như nó chưa bao giờ dừng lại.

Nếu bạn không làm gì thêm, không thực hiện thêm bất kỳ yêu cầu nào, thì khi bạn quay trở lại từ nút chức năng của bạn sẽ dừng lại, vì sau đó sẽ không có bất kỳ yêu cầu còn lại nào trong hàng đợi.

Vì vậy, nút 'biết' để tiếp tục chạy vì nó theo dõi yêu cầu công việc đang hoạt động trong bảng của nó và sẽ không dừng cho đến khi tất cả công việc xếp hàng được thực hiện và những bảng trống.

Xin lưu ý rằng "công việc xếp hàng đợi" có thể bao gồm những thứ như chờ hẹn giờ hoặc chờ dữ liệu mạng đến. Bạn thực hiện một yêu cầu mà nói "gọi cho tôi ở đây khi/nếu có điều gì xảy ra sau".

setTimeout() cũng là yêu cầu công việc (nếu bạn nheo mắt một chút). Với một bộ đếm thời gian bạn biết một cái gì đó sẽ xảy ra và khi nó sẽ xảy ra. Với setTimeout() chỉ một 'cái gì đó' sẽ xảy ra. nút sẽ chỉ thực hiện một cuộc gọi đến cuộc gọi lại của bạn và sau đó 'quên' yêu cầu công việc. Nếu thay vào đó bạn sử dụng setInterval() bạn đã tạo ra một yêu cầu công việc liên tục. nút sẽ 'giữ' yêu cầu công việc trong các bảng của nó và sẽ gọi lại gọi lại cho đến khi bạn hủy yêu cầu.

net.Server.listen() là một yêu cầu công việc khác là yêu cầu công việc liên tục. Bạn không biết khi nào gọi lại của bạn sẽ được gọi hoặc bao nhiêu lần, bởi vì điều đó phụ thuộc vào các máy khách từ xa kết nối với máy chủ của bạn. nút giữ yêu cầu công việc còn sống trong bảng của nó cho đến khi bạn hủy yêu cầu.

+15

Các khái niệm về yêu cầu công việc và bảng mà bạn đã tạo ra để minh họa cho điểm của bạn hay là những cấu trúc thực tế được sử dụng trong việc thực hiện nút? Tôi hỏi vì tôi không thấy các thuật ngữ này được sử dụng ở bất kỳ nơi nào khác. – d512

+0

Tôi tin rằng yêu cầu công việc được gọi là nhiệm vụ và bảng được gọi là hàng đợi công việc. Xem https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ –

Các vấn đề liên quan