Nodejs vòng lặp sự kiện là gì
Nút. js là thời gian chạy JavaScript hướng sự kiện không đồng bộ và hiệu quả nhất khi xây dựng các ứng dụng mạng có thể mở rộng. Nút. js không có khóa, vì vậy không có cơ hội khóa chết bất kỳ quy trình nào. vòng lặp sự kiện hoạt động và cách bạn có thể tận dụng nó để xây dựng các ứng dụng nhanh. Chúng tôi cũng sẽ thảo luận về những vấn đề phổ biến nhất mà bạn có thể gặp phải và giải pháp cho chúng
Xem tất cả các chương của Node. js ở quy mô
Vấn đềHầu hết các chương trình phụ trợ đằng sau các trang web không cần thực hiện các phép tính phức tạp. Các chương trình của chúng tôi dành phần lớn thời gian để đợi đĩa đọc và ghi hoặc đợi dây truyền thông điệp của chúng tôi và gửi lại câu trả lời Hoạt động IO có thể chậm hơn so với xử lý dữ liệu. Lấy cái này làm ví dụ. SSD-s có thể có tốc độ đọc 200-730 MB/s – ít nhất là loại cao cấp. Chỉ đọc một kilobyte dữ liệu sẽ mất 1. 4 micro giây, nhưng trong thời gian này, CPU có tốc độ 2GHz có thể đã thực hiện 28 000 chu kỳ xử lý lệnh Đối với truyền thông mạng, nó có thể còn tồi tệ hơn, chỉ cần thử và ping google. com
Độ trễ trung bình là khoảng 44 mili giây. Chỉ trong khi đợi một gói thực hiện một chuyến khứ hồi trên dây, bộ xử lý đã đề cập trước đó có thể thực hiện 88 triệu chu kỳ Giải phápHầu hết các hệ điều hành đều cung cấp một số loại giao diện IO không đồng bộ, cho phép bạn bắt đầu xử lý dữ liệu không yêu cầu kết quả của giao tiếp, trong khi giao tiếp vẫn tiếp tục Điều này có thể đạt được bằng nhiều cách. Ngày nay, nó chủ yếu được thực hiện bằng cách tận dụng khả năng đa luồng với chi phí phức tạp hơn của phần mềm. Ví dụ: đọc một tệp bằng Java hoặc Python là một thao tác chặn. Chương trình của bạn không thể làm bất cứ điều gì khác trong khi chờ giao tiếp mạng/đĩa kết thúc. Tất cả những gì bạn có thể làm - ít nhất là trong Java - là kích hoạt một luồng khác rồi thông báo cho luồng chính của bạn khi thao tác kết thúc Nó tẻ nhạt, phức tạp, nhưng hoàn thành công việc. Nhưng còn Node thì sao? . js – hoặc giống như V8 – là đơn luồng. Mã của chúng tôi chỉ có thể chạy trong một chuỗi CHỈNH SỬA. Điều này không hoàn toàn đúng. Cả Java và Python đều có không đồng bộKhông đồng bộ, trong lập trình phần mềm, đề cập đến các sự kiện xảy ra bên ngoài luồng chương trình chính và các phương pháp xử lý chúng. Các sự kiện bên ngoài chẳng hạn như tín hiệu hoặc hoạt động được nhắc bởi một chương trình xảy ra cùng lúc với việc thực hiện chương trình mà không khiến chương trình bị chặn và chờ kết quả là những ví dụ về thể loại này. Đầu vào/đầu ra không đồng bộ là một. giao diện, nhưng sử dụng chúng chắc chắn khó hơn trong Node. js. Cảm ơn Shahar và Dirk Harrington đã chỉ ra điều này. Bạn có thể đã nghe nói rằng trong trình duyệt, cài đặt Trước hết, chúng ta hãy xem ngăn xếp cuộc gọi, hay đơn giản là “ngăn xếp”. Tôi sẽ làm cho mọi thứ trở nên đơn giản, vì chúng ta chỉ cần hiểu những điều cơ bản của ngăn xếp cuộc gọi. Trong trường hợp bạn đã quen với cách thức hoạt động của nó, vui lòng chuyển sang phần tiếp theo Cây rơmBất cứ khi nào bạn gọi địa chỉ trả về của hàm, các tham số và biến cục bộ sẽ được đẩy vào ngăn xếp. Nếu bạn gọi một chức năng khác từ chức năng hiện đang chạy, nội dung của nó sẽ được đẩy lên trên cùng theo cách giống như chức năng trước đó – với địa chỉ trả về của nó Để đơn giản, tôi sẽ nói rằng 'một chức năng được đẩy' lên đầu ngăn xếp kể từ bây giờ, mặc dù nó không hoàn toàn chính xác Hãy cùng xem
sau đó gọi chính getLengthOfHypotenuse với 3 và 4 làm đối số sau đó hình vuông có giá trị là 0khi hình vuông trả về, nó được bật ra khỏi ngăn xếp và giá trị trả về của nó được chỉ định cho 1. squareA được thêm vào khung ngăn xếp của 2tương tự cho cuộc gọi tiếp theo tới hình vuông ở dòng tiếp theo, biểu thức 3 được đánh giárồi Toán. sqrt được gọi với sumOfSquares bây giờ tất cả những gì còn lại dành cho 2 là trả về giá trị cuối cùng của phép tínhgiá trị trả về được chỉ định cho 5 trong main giá trị của 5 được ghi vào bảng điều khiểncuối cùng, LƯU Ý BÊN LỀ. Bạn đã thấy rằng các biến cục bộ được bật ra khỏi ngăn xếp khi quá trình thực thi hàm kết thúc. Nó chỉ xảy ra khi bạn làm việc với các giá trị đơn giản như số, chuỗi và booleans. Giá trị của các đối tượng, mảng và như vậy được lưu trữ trong heap và biến của bạn chỉ là một con trỏ tới chúng. Nếu bạn chuyển biến này, bạn sẽ chỉ chuyển con trỏ đã nói, làm cho các giá trị này có thể thay đổi trong các khung ngăn xếp khác nhau. Khi chức năng được bật ra khỏi ngăn xếp, chỉ con trỏ tới Đối tượng được bật lên khi để lại giá trị thực trong đống. Người thu gom rác là người đảm nhiệm việc giải phóng không gian sau khi các đồ vật hết hạn sử dụng Nhập nút. vòng lặp sự kiện jsKhông, không phải vòng lặp này. 🙂 Vậy điều gì sẽ xảy ra khi chúng ta gọi thứ gì đó như 9, 0, 1 hoặc 2? . js. Để hiểu điều này, chúng ta sẽ phải hiểu thứ tự thực hiện tốt hơn một chútChúng ta hãy xem một Node phổ biến hơn. ứng dụng js – một máy chủ đang lắng nghe trên 3. Khi nhận được yêu cầu, máy chủ sẽ gọi số 4 để biết thông tin thời tiết, in một số thông báo loại tới bảng điều khiển và máy chủ sẽ chuyển tiếp phản hồi cho người gọi sau khi nhận được chúng
Điều gì sẽ được in ra ngoài việc xem thông tin thời tiết khi yêu cầu được gửi tới 5?Nếu bạn có một số kinh nghiệm với Node, bạn không nên ngạc nhiên rằng mặc dù 6 được gọi sau 7 trong mã, nhưng phần trước sẽ được in trước dẫn đến kết quả
Chuyện gì đã xảy ra thế? . Điều đó có nghĩa là bất cứ khi nào chúng ta gọi thứ gì đó là non-blocking operation, Node sẽ gọi một số mã sẽ chạy đồng thời với mã javascript của chúng ta. Khi chuỗi ẩn này nhận được giá trị mà nó đang chờ hoặc đưa ra lỗi, cuộc gọi lại được cung cấp sẽ được gọi với các tham số cần thiết LƯU Ý BÊN LỀ. 'Một số mã' mà chúng tôi đã đề cập thực sự là một phần của libuv. libuv là thư viện nguồn mở xử lý nhóm luồng, thực hiện tín hiệu và tất cả các phép thuật khác cần thiết để làm cho các tác vụ không đồng bộ hoạt động. Ban đầu nó được phát triển cho Node. js nhưng rất nhiều dự án khác hiện đang sử dụng nó
Để tìm hiểu sâu hơn, chúng tôi cần giới thiệu hai khái niệm mới. vòng lặp sự kiện và hàng đợi nhiệm vụ hàng đợi nhiệm vụJavascript là ngôn ngữ đơn luồng, hướng sự kiện. Điều này có nghĩa là chúng tôi có thể đính kèm người nghe vào các sự kiện và khi một sự kiện đã nói kích hoạt, người nghe sẽ thực hiện cuộc gọi lại mà chúng tôi đã cung cấp Bất cứ khi nào bạn gọi 9, 0 hoặc 2, Node. js gửi các thao tác này đến một luồng khác cho phép V8 tiếp tục thực thi mã của chúng tôi. Nút cũng gọi cuộc gọi lại khi bộ đếm ngừng hoạt động hoặc thao tác IO/http kết thúcCác cuộc gọi lại này có thể xử lý các tác vụ khác và các hàm đó có thể xử lý các tác vụ khác, v.v. Bằng cách này, bạn có thể đọc tệp trong khi xử lý yêu cầu trong máy chủ của mình, sau đó thực hiện cuộc gọi http dựa trên nội dung đã đọc mà không chặn xử lý các yêu cầu khác Tuy nhiên, chúng tôi chỉ có một luồng chính và một ngăn xếp cuộc gọi, vì vậy trong trường hợp có một yêu cầu khác được phục vụ khi tệp đã nói được đọc, cuộc gọi lại của nó sẽ cần đợi ngăn xếp trở nên trống rỗng. Tình trạng lấp lửng nơi các cuộc gọi lại đang chờ đến lượt chúng được thực thi được gọi là hàng đợi nhiệm vụ (hoặc hàng đợi sự kiện hoặc hàng đợi tin nhắn). Các cuộc gọi lại đang được gọi trong một vòng lặp vô hạn bất cứ khi nào luồng chính hoàn thành nhiệm vụ trước đó, do đó có tên là 'vòng lặp sự kiện' Trong ví dụ trước của chúng tôi, nó sẽ giống như thế này
Vì vậy, bây giờ chúng ta có thể hiểu tại sao bản hack 9 được đề cập trước đó lại hoạt động. Mặc dù chúng tôi đặt bộ đếm thành 0, nhưng nó sẽ trì hoãn việc thực thi cho đến khi ngăn xếp hiện tại và hàng đợi tác vụ trống, cho phép trình duyệt vẽ lại giao diện người dùng hoặc Nút để phục vụ các yêu cầu khácNhiệm vụ vi mô và nhiệm vụ vĩ môNếu điều này là không đủ, chúng tôi thực sự có nhiều hơn một hàng đợi nhiệm vụ. Một cho các tác vụ vi mô và một cho các tác vụ vĩ mô ví dụ về microtask
ví dụ về macrotask
Hãy xem đoạn mã sau
điều này sẽ đăng nhập vào bảng điều khiển
Theo thông số kỹ thuật, chính xác một tác vụ (macro) sẽ được xử lý từ hàng đợi tác vụ macro trong một chu kỳ của vòng lặp sự kiện. Sau khi macrotask đã nói kết thúc, tất cả các microtask có sẵn sẽ được xử lý trong cùng một chu kỳ. Trong khi các vi nhiệm vụ này đang được xử lý, chúng có thể xếp hàng nhiều vi nhiệm vụ hơn, tất cả các vi nhiệm vụ này sẽ được chạy từng cái một cho đến khi hết hàng đợi vi nhiệm vụ Sơ đồ này cố gắng làm cho hình ảnh rõ ràng hơn một chút Trong trường hợp của chúng ta chu kỳ 1
hàng đợi nhiệm vụ. 1, 5chu kỳ 2
hàng đợi nhiệm vụ. 5, 1Chu kỳ 3
hàng đợi nhiệm vụ. 1, 9Chu kỳ 4
hàng đợi nhiệm vụ. 9, setTimeout(someFunction, 0) 1
Bây giờ, trình xử lý của Chúng tôi cũng có thể sửa lỗi này trong Node bằng quy trình. nextTick và một số địa ngục gọi lại khó hiểu
Đây là logic chính xác giống như những lời hứa yêu dấu của chúng tôi sử dụng, chỉ là một chút gớm ghiếc hơn. Ít nhất thì nó cũng hoàn thành công việc theo cách chúng ta mong đợi Chế ngự con thú không đồng bộNhư chúng ta đã thấy, chúng ta cần quản lý và chú ý đến cả hàng đợi tác vụ và vòng lặp sự kiện khi chúng ta viết một ứng dụng trong Node. js - trong trường hợp chúng tôi muốn tận dụng tất cả sức mạnh của nó và nếu chúng tôi muốn giữ cho các tác vụ chạy dài của mình không chặn luồng chính Ban đầu, vòng lặp sự kiện có thể là một khái niệm khó nắm bắt, nhưng một khi bạn đã hiểu rõ về nó, bạn sẽ không thể tưởng tượng rằng có sự sống nếu không có nó. Kiểu truyền liên tục có thể dẫn đến địa ngục gọi lại có thể trông xấu xí, nhưng chúng tôi có Lời hứa và chúng tôi sẽ sớm có async-await trong tay… và trong khi chúng tôi đang (a)chờ đợi, bạn có thể mô phỏng async-await bằng cách sử dụng co và Một lời khuyên chia tay cuối cùng Biết cách Node. js và V8 xử lý các lệnh thực thi trong thời gian dài, bạn có thể bắt đầu sử dụng nó vì lợi ích của riêng mình. Trước đây bạn có thể đã nghe nói rằng bạn nên gửi các vòng lặp đang chạy dài của mình vào hàng đợi tác vụ. Bạn có thể làm thủ công hoặc sử dụng async. js Mã hóa vui vẻ Nếu bạn có bất kỳ câu hỏi hoặc suy nghĩ nào, hãy chia sẻ chúng trong phần bình luận, tôi sẽ ở đó. Phần tiếp theo của Nút. js tại Chuỗi quy mô đang thảo luận về Bộ sưu tập rác trong Node. js, tôi khuyên bạn nên kiểm tra nó Vòng lặp sự kiện trong js là gì?JavaScript có mô hình thời gian chạy dựa trên vòng lặp sự kiện, chịu trách nhiệm thực thi mã, thu thập và xử lý sự kiện cũng như thực hiện các tác vụ phụ được xếp hàng đợi. This model is quite different from models in other languages like C and Java.
Vòng lặp sự kiện và Eventemitter trong nút JS là gì?Vòng lặp sự kiện trong Nodejs. Để đạt được nó, nodejs có các sự kiện và cuộc gọi lại. Vòng lặp sự kiện là một vòng lặp vô hạn và trong mỗi lần lặp, nó sẽ kiểm tra hàng đợi sự kiện xem có sự kiện nào được kích hoạt không, nếu tìm thấy thì thực hiện và xóa nó khỏi hàng đợi
Tại sao vòng lặp sự kiện cần thiết?Vòng lặp sự kiện hỗ trợ quá trình này; . Nếu nó trống, các chức năng mới sẽ được thêm vào từ hàng đợi sự kiện. Nếu không, thì lệnh gọi hàm hiện tại được xử lý. it constantly checks whether or not the call stack is empty. If it is empty, new functions are added from the event queue. If it is not, then the current function call is processed.
Sự khác biệt giữa gọi lại và vòng lặp sự kiện là gì?Hàng gọi lại. Sau khi bộ hẹn giờ hết hạn, chức năng gọi lại được đặt bên trong Hàng đợi gọi lại và Vòng lặp sự kiện sẽ kiểm tra xem Ngăn xếp cuộc gọi có trống không và nếu trống, sẽ đẩy chức năng gọi lại từ Hàng đợi gọi lại vào Ngăn xếp cuộc gọi . . |