Ưu và nhược điểm của đa luồng trong python

Chúng tôi đã giới thiệu đa quy trình và đa luồng, đây là hai cách phổ biến nhất để đạt được đa nhiệm. Bây giờ, hãy thảo luận về ưu và nhược điểm của cả hai phương pháp

Đầu tiên, để đạt được đa nhiệm, chúng ta thường thiết kế mô hình master-worker, trong đó master chịu trách nhiệm phân công nhiệm vụ và worker chịu trách nhiệm thực hiện các nhiệm vụ, vì vậy trong môi trường đa nhiệm, thường là một master, nhiều worker.

Nếu bạn triển khai master-worker với nhiều quy trình, thì quy trình chính là master và quy trình còn lại là Worker

Nếu Master-worker được triển khai với đa luồng, luồng chính là chủ và các luồng khác là worker

Ưu điểm lớn nhất của chế độ đa tiến trình là tính ổn định cao, vì một tiến trình con bị treo mà không ảnh hưởng đến tiến trình chính và các tiến trình con khác. [Tất nhiên, main process bị treo tất cả các process đều bị treo, nhưng master process chỉ chịu trách nhiệm phân công nhiệm vụ, khả năng bị treo thấp] Apache nổi tiếng là chế độ đa tiến trình đầu tiên

Nhược điểm của chế độ đa quy trình là chi phí tạo quy trình lớn và trong hệ thống Unix/linux, có thể thực hiện cuộc gọi ngã ba và chi phí xử lý trong Windows là rất lớn. Ngoài ra, hệ điều hành có thể chạy đồng thời số lượng quy trình cũng bị hạn chế, dưới các ràng buộc về bộ nhớ và CPU, nếu có hàng nghìn quy trình chạy đồng thời, hệ điều hành thậm chí lập lịch sẽ gặp vấn đề.

Chế độ đa luồng thường nhanh hơn chế độ đa quy trình, nhưng nó không nhanh và nhược điểm chết người của chế độ đa luồng là bất kỳ luồng nào bị treo có thể trực tiếp khiến toàn bộ quy trình bị sập vì tất cả các luồng đều chia sẻ bộ nhớ của quy trình. Trên Windows, nếu một luồng thực thi gặp sự cố với mã, bạn thường có thể thấy gợi ý rằng "chương trình đang thực hiện một hoạt động bất hợp pháp sắp đóng lại", đây thường là sự cố với một luồng, nhưng hệ điều hành buộc

Trong Windows, đa luồng hiệu quả hơn nhiều quy trình, vì vậy máy chủ IIS của Microsoft sử dụng chế độ đa luồng theo mặc định. Do tính ổn định của đa luồng nên IIS kém ổn định hơn Apache. Để giảm bớt vấn đề này, IIS và Apache hiện có chế độ hỗn hợp đa tiến trình + đa luồng, đây là vấn đề phức tạp hơn

chuyển đổi chủ đề

Cho dù đó là đa quy trình hay đa luồng, miễn là số lượng nhiều, hiệu quả chắc chắn sẽ không đi, tại sao?

Chúng ta làm một phép loại suy, giả sử bạn không may đang chuẩn bị cho bài kiểm tra, mỗi buổi tối cần làm bài tập ngữ văn, toán, anh, lý, hóa, 5 bài, mỗi bài thời gian 1 tiếng

Nếu bạn dành 1 giờ để làm bài tập tiếng Trung, hoàn thành, sau đó dành 1 giờ để làm bài tập toán, như vậy, lần lượt làm xong tất cả, tổng cộng là 5 giờ, phương pháp này được gọi là mô hình nhiệm vụ đơn lẻ hoặc mô hình nhiệm vụ hàng loạt

Giả sử bạn định chuyển sang mô hình đa nhiệm, bạn có thể làm ngôn ngữ 1 phút rồi chuyển sang toán, làm 1 phút rồi chuyển sang tiếng Anh, v.v., miễn là tốc độ chuyển đổi đủ nhanh, cách này và cách khác

Tuy nhiên, chuyển việc là phải trả giá, chẳng hạn như từ cắt ngữ văn sang toán học, phải dọn bàn sách tiếng Trung, bút mực [cái này gọi là chỗ bảo quản], rồi mở sách toán ra, tìm cái thước la bàn [cái này là . Hệ điều hành cũng vậy khi chuyển đổi các tiến trình hoặc luồng, nó cần lưu lại quá trình thực thi hiện tại của môi trường trường [trạng thái thanh ghi CPU, trang bộ nhớ, v.v. ], sau đó chuẩn bị môi trường thực thi của tác vụ mới [khôi phục trạng thái thanh ghi cuối cùng, chuyển trang bộ nhớ, v.v. ] trước khi bạn có thể bắt đầu thực hiện. Quá trình chuyển đổi này diễn ra nhanh chóng nhưng cũng mất thời gian. Nếu có hàng nghìn tác vụ cùng lúc, hệ điều hành có thể chủ yếu bận chuyển đổi tác vụ, không có nhiều thời gian để thực hiện tác vụ, phổ biến nhất là ổ cứng, cửa sổ điểm không phản hồi, hệ thống ở trạng thái hoạt hình bị treo

Vì vậy, một khi đa tác vụ đến giới hạn sẽ ngốn hết tài nguyên của hệ thống, khiến hiệu suất giảm sút rõ rệt, mọi tác vụ đều không tốt

Tính toán chuyên sâu so với. chuyên sâu IO

Việc xem xét thứ hai với đa nhiệm là loại nhiệm vụ. Chúng ta có thể chia nhiệm vụ thành chuyên sâu tính toán và chuyên sâu IO

Các tác vụ tính toán chuyên sâu được đặc trưng bởi một số lượng lớn tính toán tiêu tốn tài nguyên CPU, chẳng hạn như PI, video giải mã HD, v.v., tất cả đều dựa vào sức mạnh tính toán của CPU. Tác vụ đòi hỏi nhiều tính toán này có thể được thực hiện bằng đa nhiệm, nhưng càng nhiều tác vụ, càng mất nhiều thời gian để chuyển đổi tác vụ, CPU càng kém hiệu quả để thực hiện tác vụ, vì vậy mức sử dụng CPU hiệu quả nhất phải bằng số lượng

Các tác vụ sử dụng nhiều điện toán rất quan trọng đối với hiệu quả mã của bạn vì chúng chủ yếu tiêu thụ tài nguyên CPU. Các ngôn ngữ viết kịch bản như Python không hiệu quả và hoàn toàn không phù hợp với các tác vụ tính toán chuyên sâu. Đối với các tác vụ tính toán chuyên sâu, tốt nhất nên viết bằng C

Loại nhiệm vụ thứ hai là IO chuyên sâu, các nhiệm vụ liên quan đến mạng, đĩa IO là các nhiệm vụ chuyên sâu IO, được đặc trưng bởi mức tiêu thụ CPU thấp và phần lớn thời gian nhiệm vụ đang chờ hoạt động IO hoàn thành [vì IO là . Đối với các tác vụ chuyên sâu IO, bạn càng có nhiều tác vụ, hiệu suất CPU càng cao, nhưng có giới hạn. Hầu hết các tác vụ phổ biến là các tác vụ chuyên sâu về IO, chẳng hạn như các ứng dụng Web

Thực thi tác vụ chuyên sâu IO, 99% thời gian dành cho IO, thời gian dành cho CPU rất ít, vì vậy ngôn ngữ C chạy nhanh để thay thế ngôn ngữ kịch bản tốc độ rất thấp bằng Python, hoàn toàn không thể cải thiện hoạt động . Đối với các tác vụ chuyên sâu IO, ngôn ngữ phù hợp nhất là ngôn ngữ hiệu quả nhất [ít mã nhất], ngôn ngữ kịch bản được ưu tiên và ngôn ngữ C là ngôn ngữ tồi tệ nhất

IO không đồng bộ

Xem xét sự khác biệt lớn về tốc độ giữa CPU và IO, một tác vụ đang chờ hoạt động của IO hầu hết thời gian trong quá trình thực thi và mô hình đơn luồng đơn xử lý khiến các tác vụ khác không được thực thi song song, vì vậy chúng ta cần một đa tác vụ.

Hệ điều hành hiện đại đã có những cải tiến lớn đối với hoạt động IO, với tính năng lớn nhất là hỗ trợ IO không đồng bộ. Nếu bạn tận dụng hỗ trợ IO không đồng bộ do hệ điều hành cung cấp, bạn có thể sử dụng mô hình đơn luồng xử lý đơn để thực hiện đa nhiệm, mô hình mới được gọi là mô hình hướng sự kiện, Nginx là máy chủ Web hỗ trợ IO không đồng bộ, . Trên CPU đa lõi, bạn có thể chạy nhiều tiến trình [cùng số với số lõi CPU] để tận dụng lợi thế của CPU đa lõi. Bởi vì tổng số tiến trình trong hệ thống rất hạn chế, việc lập lịch hệ điều hành rất hiệu quả. Sử dụng mô hình lập trình IO không đồng bộ để đạt được đa tác vụ là một xu hướng chính

tương ứng với ngôn ngữ Python, mô hình lập trình không đồng bộ đơn luồng được gọi là đồng xử lý và với sự hỗ trợ của bộ đồng xử lý, một chương trình đa nhiệm hiệu quả có thể được viết dựa trên hướng sự kiện.

Những lợi thế và bất lợi của đa luồng là gì?

Chức năng chính của đa luồng là chạy hoặc thực thi đồng thời nhiều tác vụ. .
Quá trình gỡ lỗi và thử nghiệm phức tạp
Chuyển đổi bối cảnh trên cao
Tăng khả năng xảy ra bế tắc
Tăng độ khó khi viết chương trình
kết quả không thể đoán trước

Lợi ích của đa luồng trong Python là gì?

Đa luồng trong Python hợp lý hóa việc sử dụng tài nguyên hiệu quả vì các luồng chia sẻ cùng một bộ nhớ và không gian dữ liệu . Nó cũng cho phép xuất hiện đồng thời nhiều tác vụ và giảm thời gian phản hồi. Điều này cải thiện hiệu suất.

Nhược điểm của đa luồng là gì?

Các ứng dụng đa luồng và đa ngữ cảnh có những nhược điểm sau. .
Khó khăn khi viết mã. Các ứng dụng đa luồng và đa ngữ cảnh không dễ viết. .
Khó gỡ lỗi. .
Khó khăn trong việc quản lý đồng thời. .
Khó kiểm tra. .
Khó chuyển mã hiện có

Đa luồng là gì, ưu điểm của nó là gì?

Đa luồng cho phép thực thi nhiều phần của chương trình cùng một lúc . Những phần này được gọi là luồng và là các quy trình nhẹ có sẵn trong quy trình. Vì vậy, đa luồng dẫn đến việc sử dụng tối đa CPU bằng đa nhiệm.

Chủ Đề