Hiểu biết mới về Node là nếu tôi viết lại mã đồng bộ hoặc mã nội tuyến, để sử dụng các hàm/gọi lại, tôi có thể đảm bảo rằng mã của tôi không bị chặn. Tôi rất tò mò về cách thức hoạt động này về mặt ngăn xếp sự kiện. Ví dụ đơn giản từ đây: Don't understand the callback - Stackoverflow là điều này sẽ chặn:Tại sao chức năng và gọi lại không bị chặn trong Node.JS?
var post = db.query("select * from posts where id = 1");
doSomethingWithPost(post)
doSomethingElse();
Trong khi này wont:
callback = function(post){
doSomethingWithPost(post)
}
db.query("select * from posts where id = 1",callback);
doSomethingElse();
Ok, tôi hiểu rằng chúng tôi nên sử dụng callbacks. Nhưng về mặt sự kiện, tại sao nó lại hoạt động? Javascript là một chuỗi duy nhất .. trong dòng ví dụ đầu tiên, sử dụng một hoạt động I/O đắt tiền và chặn. Dòng 2 không thể thực hiện cho đến khi một dòng được thực hiện. Đây có phải là vì dòng 2 yêu cầu thông tin từ dòng 1 không? Hoặc là bởi vì các sự kiện I/O chỉ đơn giản là chặn các hoạt động có nghĩa là chúng chiếm quyền kiểm soát và không trả lại cho đến khi ...
Trong ví dụ thứ hai, I/O đắt tiền đã được chuyển thành một hàm, và bây giờ chúng ta có chức năng gọi lại. Chắc chắn cuộc gọi lại không thể thực hiện cho đến khi I/O được thực hiện .. Điều này sẽ không thay đổi. Vì vậy, sự khác biệt về lượng thời gian cần thiết để thực hiện giữa một và hai phải chủ yếu là những gì sẽ xảy ra nếu một yêu cầu thứ hai nhấn vào máy chủ.
Nếu yêu cầu thứ hai nhấn một ví dụ, nó sẽ không thể xử lý cho đến khi yêu cầu 1 được thực hiện vì hoạt động chặn .. nhưng trong ví dụ hai .. di chuyển các hoạt động vào các chức năng tự động sinh ra các tiến trình con hoặc hành động như đa luồng? Nếu Javscript là đơn luồng này vẫn sẽ gây ra vấn đề, trừ khi có một số cách xử lý song song .. Có một hàm/callback chỉ đảm bảo là không chặn NẾU chúng ta sử dụng các kỹ thuật không chặn như các tiến trình con, v.v. .
Cảm ơn sự tương tự tuyệt vời. Để làm rõ thêm. Trong ví dụ này một nhân viên thu ngân nhận một đơn đặt hàng và đưa nó trở lại nhà bếp, sau đó anh ta có thể đi và xử lý một đơn đặt hàng khác. Bây giờ người đặt hàng ở đây là chức năng máy chủ chính .. và nhà bếp là tất cả các chức năng được ủy quyền với các cuộc gọi lại của riêng họ. Nếu chức năng máy chủ đại biểu cho một chức năng và đưa cho họ một cuộc gọi lại và nói .. lấy lại cho tôi khi thực hiện .. Nếu nhà bếp không được đưa ra một phương tiện sinh sản một quá trình con .. nó sẽ không vẫn chặn cho đến khi gọi lại đã được gửi? – Inc1982
Nhà bếp có hồ bơi ren bên trong. Vì vậy, nó sẽ có một số chủ đề để phân phối các nhiệm vụ. Nhưng điều này được tóm tắt từ bạn trong Node.js và không có điều nào trong số đó được thực thi trong vòng lặp sự kiện của bạn, vì vậy nó sẽ không ảnh hưởng đến mã của bạn chút nào. Nếu bạn thực hiện một số phép tính chuyên sâu của CPU trong mã của riêng bạn, điều đó sẽ chặn _ toàn bộ vòng lặp sự kiện_ (như, giả sử nhân viên thu ngân quyết định nướng một trong các ổ bánh - trong thời gian này, anh ta không thể lấy bất kỳ đơn hàng mới nào). –
Bạn có nói rằng đối với một nút chức năng/callback chuẩn có thể sử dụng một pool thread bên trong để đảm bảo hiệu suất không đồng bộ nhưng đối với một cuộc gọi đắt tiền, chúng ta sẽ cần thiết lập một nhân viên như những gì exec sẽ làm gì? Nếu vậy, làm cách nào tôi biết ngưỡng 'đắt tiền'? Điều đó dường như là một điểm then chốt sau đó. – Inc1982