Luồng điều khiển không đồng bộ trong Node.js là gì?

Luong Dieu Khien Khong Dong Bo Trong Node Js La Gi



Luồng điều khiển là cách thực thi trong đó quy trình cư trú của ứng dụng của bạn được thực thi. Luồng này giúp ích rất nhiều khi bạn muốn thực thi một phần cụ thể của toàn bộ chương trình trước hoặc sau khi hoàn thành một phương thức ngẫu nhiên. Luồng thực thi thường được đặt ở chế độ không đồng bộ hoặc đồng bộ tùy theo tính chất của phương thức đang được sử dụng.

Bài viết này giải thích cách hoạt động và triển khai luồng điều khiển không đồng bộ trong Node.js.

Luồng điều khiển không đồng bộ trong Node.js là gì?

Luồng điều khiển không đồng bộ trong Node.js đề cập đến cách bạn quản lý và kiểm soát luồng thực thi khi xử lý các hoạt động không đồng bộ, chẳng hạn như thực hiện yêu cầu mạng, xử lý sự kiện, v.v. Mặc dù Node.js được thiết kế đặc biệt cho tính chất không đồng bộ nhưng tốt hơn là bạn nên đảm bảo rằng mã cụ thể thực thi theo trình tự dự định và thực hiện xử lý lỗi một cách hiệu quả.







Hãy lấy một ví dụ về mã để nâng cao mức độ dễ hiểu của luồng điều khiển không đồng bộ:



là fsObj = yêu cầu ( 'fs' ) ;
//Hàm gọi lại trừu tượng
chức năng readFileAsync ( đường dẫn tệp đích ) {
trở lại mới Hứa ( ( giải quyết, bác bỏ ) => {
fsObj. Đọc tài liệu ( targetFilePath, 'utf-8' , ( lỗi, nội dung ) => {
nếu như ( lỗi ) {
từ chối ( lỗi ) ;
} khác {
giải quyết ( nội dung ) ;
}
} ) ;
} ) ;
}

// Hàm thực hiện đọc nhiều file theo trình tự
chức năng không đồng bộ readFileSequentially ( ) {
thử {
hằng số tập tin1Dữ liệu = đang chờ readFileAsync ( 'mynewfile1.txt' ) ;
bảng điều khiển. nhật ký ( 'Dữ liệu tệp đầu tiên:' , tập tin1Dữ liệu ) ;

hằng số tập tin2Data = đang chờ readFileAsync ( 'usecase.txt' ) ;
bảng điều khiển. nhật ký ( 'Dữ liệu tệp thứ hai:' , tập tin2Data ) ;

hằng số tập tin3Data = đang chờ readFileAsync ( 'gói.json' ) ;
bảng điều khiển. nhật ký ( 'Dữ liệu tệp thứ ba:' , tập tin3Data ) ;
} nắm lấy ( lỗi ) {
bảng điều khiển. lỗi ( 'Đã xảy ra lỗi:' , lỗi ) ;
}
}

readFileTuần tự ( ) ;

Giải thích đoạn code trên như sau:



  • Đầu tiên, nhập “ fs ” mô-đun và lưu trữ đối tượng của nó trong “ fsObj ' Biến đổi.
  • Sau đó, xác định một “ readFileAsync() ” hàm được đặt tên có tham số duy nhất là “ đường dẫn tệp đích ” chứa đường dẫn cho tệp được nhắm mục tiêu.
  • Hàm này trả về một “ hứa ” chứa hàm gọi lại được yêu cầu bao gồm hai tham số là “ giải quyết ' Và ' từ chối ”.
  • Bên trong hàm gọi lại, hãy gọi “ Đọc tài liệu() ” phương pháp được cung cấp bởi “ fs ” mô-đun. Ngoài ra, hãy chuyển tham số được cung cấp của “ đường dẫn tệp đích ” làm tham số đầu tiên cho phương thức “readFile()”.
  • Các ' Đọc tài liệu Phương thức ” cũng chứa hàm gọi lại cần thiết có các tham số là “ lỗi ' Và ' nội dung ”. Vượt qua ' lỗi ' vào ' từ chối() ” phương pháp trong trường hợp xảy ra lỗi và “ nội dung ' vào ' giải quyết() ” trong trường hợp không tìm thấy lỗi.
  • Bây giờ, tạo một hàm không đồng bộ có tên “ readFileSequentialy() ” và nó chứa một “ cố gắng bắt ' khối.
  • Bên trong “ thử ” khối, tạo ba biến lưu trữ kết quả được tạo bằng cách gọi khối đã được tạo “ readFileAsync() ' chức năng. Mỗi lần đường dẫn cho tệp mong muốn cần được thực thi sẽ được chuyển vào bên trong dấu ngoặc đơn của hàm này.
  • Từ khóa “ chờ đợi ” cũng được đặt phía sau hàm tại thời điểm gọi để dừng luồng điều khiển cho đến khi hành động đọc tệp hoàn tất.
  • Ngoài ra, hiển thị các biến trên bảng điều khiển để hiển thị nội dung tệp được truy xuất hoặc đọc.
  • Cuối cùng, gọi hàm chứa “ readFileSequentialy() ' chức năng.

Để thực thi, hãy đặt đoạn mã nêu trên vào tệp bạn muốn có phần mở rộng là “ .js ” nằm bên trong dự án Node.js của bạn. Tệp chính trong trường hợp của chúng tôi là “ controlFlow.js ”, do đó lệnh thực thi của chúng ta sẽ như sau:





luồng điều khiển nút. js

Đầu ra được tạo cho thấy dữ liệu cho các tệp mong muốn sử dụng luồng điều khiển không đồng bộ được hiển thị theo trình tự:



Nguyên nhân có thể và các bước tránh đối với mã bị chặn Node.js là gì?

Mã đồng bộ còn được gọi là “ Mã khối ” vì nó tạm dừng việc thực thi các tiến trình cho đến khi thực thi tiến trình đang chạy. Điều này dẫn đến hiệu suất và khả năng phản hồi của ứng dụng kém. Mã chặn thường xảy ra do các hoạt động đồng bộ hoặc bị ràng buộc bởi CPU. Các nguyên nhân có thể gây ra việc chặn mã và cách tránh chúng được nêu trong bảng bên dưới:

Nguyên nhân gây chặn mã Giải pháp chặn mã
Sử dụng các thao tác tệp đồng bộ như fs.readFileSync(). Sử dụng các thao tác tệp không đồng bộ như fs.readFile.
Sử dụng các hoạt động liên quan đến CPU như tính toán nặng hoặc các vòng lặp chạy dài. Giảm tải các tác vụ liên quan đến CPU cho các luồng công việc bằng cách chia chúng thành các phần nhỏ hơn, không chặn.
Yêu cầu mạng bên ngoài chậm do sử dụng yêu cầu HTTP tới API từ xa Sử dụng các thư viện HTTP không đồng bộ như Axios hoặc các mô-đun “http” hoặc “https” tích hợp sẵn.
Truy vấn cơ sở dữ liệu không được tối ưu hóa Tối ưu hóa các truy vấn cơ sở dữ liệu bằng cách sử dụng các công cụ tối ưu hóa truy vấn do cơ sở dữ liệu cung cấp.
Sử dụng vòng lặp vô hạn hoặc vòng lặp chặt chẽ không ngắt quãng. Đảm bảo rằng các vòng lặp có điều kiện thoát và không chạy vô tận.

Phần kết luận

Luồng điều khiển không đồng bộ sử dụng từ khóa “ không đồng bộ/đang chờ ” để sửa đổi hoặc kiểm soát luồng thực thi theo cách không đồng bộ. Lệnh gọi lại cho phương thức không đồng bộ được yêu cầu sẽ được trừu tượng hóa và lưu trữ trong một hàm riêng biệt. Sau đó, hàm này được gọi với sự trợ giúp của từ khóa chờ đợi một cách tuần tự cùng với các phương thức khác theo ý muốn. Các hàm này được lưu trữ trong một hàm không đồng bộ tùy chỉnh khác, sau đó được gọi để bắt đầu thực thi. Hướng dẫn này đã giải thích luồng điều khiển không đồng bộ trong Node.js.