Luồng ở đây là nhân CPU. Toàn bộ chỉ có 1 process nodejs thực thi lệnh từ đầu tới cuối thôi bạn. Khi chạy code bất đồg bộ thì nó sẽ xếp code lần lượt, xen kẽ để cho process không có thời nghỉ
Xin một ví dụ giải thích callback trong Javascript là non-blocking?
Mình nghĩ rất nhiều bạn đang hiểu sai cơ chế của NodeJS. NodeJS bắt các bạn phải tư duy theo kiểu bất đồng bộ, không cho sử dụng thread giúp cho việc tu duy logic từ trên xuống đơn giản hơn, mạch lạc hơn, tránh bị tranh chấp resource nếu làm việc với thread.
Còn behind the scence, mình giải thích ngắn gọn thế này.
-
Khi bạn gọi 1 lệnh, bình thường bạn phải đợi kết quả thì lệnh tiếp theo mới thực hiện được. Việc này sẽ dẫn tới việc lệnh này block lệnh kia, nhưng dữ liệu luôn đồng bộ và an toàn. Ví dụ như sáng nay bạn có 3 việc: sáng dậy tưới cây, xong rồi đi học, trưa về nấu cơm. 3 việc cứ làm tuần tự thôi, tưới cây xong thì đi học, tưới cây chưa xong thì … nghỉ học.
-
Có cách nào # không? À, bạn sẽ đóng vai trò là một manager, sáng không cần tưới cây, gọi thằng đệ vào tưới, bảo nó khi nào tưới xong thì gọi tao để tao báo cáo với mẹ. Còn mình thì ngồi rung đùi tán gái, cuộc đời có phải sướng hơn không? Cũng như vậy, tới việc đó, NodeJS sẽ mark 1 cái event (gọi là lập trình event-driven), chưa cần kết quả trả về mà sẽ có 1 callback để khi xong thì làm (ví dụ báo cáo với mẹ). Bản thân NodeJS phía dưới sẽ phải có những thread # xử lý đống event này (message queue / message bus). Do đó đơn luồng ở đây chỉ là nói tới cách xử lý file .js, còn thực tế nó vẫn phải có 1 thằng manager để sắp xếp đống event và phân công từng worker (đệ) tương ứng. Đứng ở vai trò người mẹ, mẹ vẫn thấy nó hoàn thành xong việc tưới cây, đi học và nấu cơm nhưng rõ ràng cách xử lý # hẳn bị blocking (giống trường hợp thằng con ngoan đầu tiên). Thằng con đại ca giờ rảnh rang hơn, vẫn xong việc mà vẫn đi làm thêm việc khác được (như tán gái chẳng hạn) .
Hiển nhiên thì code gì thì code (cả sync lẫn async) nó vẫn phải là lần lượt và CPU tại 1 thời điểm thì chỉ thực hiện được 1 lệnh mà thôi. Các tác vụ IO sẽ được thằng manager phân công cho các thằng đệ trẻ khoẻ của OS gánh và trả về khi xong. Nhược điểm là nếu có nhiều processors / core / hyperthreading thì NodeJS không tận dung được hết bọn worker này. Vì thế, mới đẻ ra thằng Node Process Manager để có thể quản lý nhiều tiến trình NodeJS, cho nó chạy trên các hệ thống đa processor / cores / hyper threading.
Note: Luồng = thread, còn process = tiến trình
Cores: nhân, Processor: bộ xử lí lệnh, Hyper-Threading: bản thân CPU nó cung có Scheduler phân nhiệm vụ cho 2 luồng, hệ điều hành nhìn 1 con Processor có công nghệ HP là 2 con.
Quá chi tiết và thực tế . cảm ơn bạn nhiều
Khó quản lý code nhìn ko thông thoáng anh người ta hay gọi là HaDouKen code , đa số người ta sẽ gọi tách hàm ra .
Đọc bài của ông này dễ hiểu thật
Non-Blocking là non-blocking đối với thao tác I/O thôi , chứ callback đơn gản chỉ là truyền hàm vào hàm hết , bạn cần phân biệt các cặp khái niệm( blocking , non-blocking ),( asynchronous , synchronous)
Cái này mình nghĩ không đúng, CPU không đơn thuần chỉ xử lý tuần tự như bạn nghĩ.
CPU là một vi kiến trúc nó mang tính chất như chuỗi phản ứng thông thường.
Ví dụ: 1 một chuỗi thông tin cần xử lý được đưa vào mã hóa -> CPU không phân biệt là chuỗi thông tin của bạn thuộc sự kiện nào hay tiến trình nào (vì cái đó chỉ là thuộc hệ thống ngôn ngữ lập trình của bạn quy ước thôi)
Tiếp đến là nó nhận thông tin kiểu (Binary) trên cơ chế vật lý thì tất cả đều được xảy ra cùng một lúc và liên tục (theo thời gian).
Ví như một đổ 1 giọt mực vào một cốc nước. (sự hòa tan xảy ra cùng một thời điểm và liên tục lan tỏa…)
Về đầu ra Out-put: tức nhiên bạn sẽ thấy nó có các hệ thống Stack để dễ dàng quản lý thôi, thì thuộc về ngôn ngữ lập trình. (nghĩa là thông tin đã xử lý xong thì trả ra rồi tùy và Hệ thống ngôn ngữ lập trình và cách viết của Code bạn để trình bày sync hay Async