Hàng đợi đa xử lý asyncio python
Không đồng bộ, trong lập trình máy tính, đề cập đến sự xuất hiện của các sự kiện độc lập với luồng chương trình chính và cách xử lý các sự kiện đó. Đây có thể là các sự kiện “bên ngoài” như tín hiệu xuất hiện, hoặc hành động do chương trình khởi xướng diễn ra đồng thời với việc thực hiện chương trình mà không bị chặn chương trình để chờ kết quả. Đầu vào/đầu ra không đồng bộ là một ví dụ về nguyên nhân thứ hai của sự không đồng bộ và cho phép các chương trình ra lệnh cho các thiết bị lưu trữ hoặc mạng phục vụ các yêu cầu này trong khi bộ xử lý tiếp tục thực thi chương trình. Làm như vậy cung cấp một mức độ song song Show Hình ảnh bên dưới cho chúng ta thấy một số giải pháp cho các vấn đề về bất đồng bộ Hệ thống sinh thái của bất đồng bộ lập trìnhLưu ý, các luồng trong Python là các luồng gốc, nhưng thực hiện một số chính sách (cụ thể là trong bản cpython), GIL (Khóa phiên dịch toàn cầu) sẽ không cho phép chúng chạy 2 luồng đồng thời. Do đó, các thread Python không thực sự xử lý song song và thật sự mình không thích sử dụng chúng làm
Chúng ta có thể thấy rằng, các luồng và quy trình đều sở hữu một khoảng không gian bộ nhớ của riêng nó, do đó, chúng có thể thực hiện các công việc độc lập với luồng chính hoặc quy trình chính Trái lại, vòng lặp sự kiện duy trì các nhiệm vụ, các nhiệm vụ này chia sẻ bộ nhớ chung và chúng ta phải trả lời câu hỏi. 0Khi nào chúng ta sử dụng event loop, thread hay process?Trong khoa học máy tính, chúng ta có thể phân tác vụ thành 2 loại
Ví dụ
Qua ví dụ trên, ta tháy rằng vòng lặp sự kiện chỉ thực sự hữu dụng trong vấn đề liên quan đến IO bound. Chúng được sử dụng trong các hệ thống sự kiện và các hệ thống tương tự. Chúng có thể là giải pháp tốt nhất cho các vấn đề liên quan đến IO bound Các vấn đề trong vòng lặp sự kiện mô hìnhChúng ta đã biết rằng chúng ta có một ngữ cảnh của một hàm bất kỳ. Ngữ cảnh này bao gồm các biến và chúng được giải phóng sau khi hàm kết thúc (giải phóng ra khỏi ngăn xếp) Trong tác vụ giới hạn I/O, chúng ta sẽ có một vài lệnh lấy dữ liệu (thao tác IO) mà lúc đó chúng ta cần tối ưu hóa (chẳng hạn như ví dụ về David, anh ta có thể tạm dừng các tác vụ đang chờ kiểm tra và Như vậy các ngắt là một vấn đề, làm sao chúng ta có thể tạo ra các ngắt trong hàm mà vẫn giữ nguyên ngữ cảnh của hàm để có thể thực thi tiếp? Tại các ngắt đó, hàm đang thực thi(callee) cần trao lại quyền điều khiển chương trình (program control) cho nơi đã gọi hàm đó (gọi), ở đây thực chất là vòng lặp sự kiện và chúng ta cũng cần bắt đầu tại điểm Giải pháp ở đây là sử dụng coroutine Coroutine là gì?Donald Knuth nói rằng
Đúng vậy, tổng quát hóa, các hàm bình thường chúng ta hay sử dụng (hàm được giải nén ngữ cảnh sau khi thoát khỏi hàm) là trường hợp đặc biệt của coroutine - nơi ngữ cảnh đó có thể được giữ lại khi nó được sử dụng tạm thời Chương trình con vs CoroutineTại sao coroutine lại sở hữu ứng dụng cho hệ thống sự kiện?
Đơn vị làm việcProcessNative threadLuồng xanhGoroutineCoroutineBộ nhớ≤ 8Mb≤ Nx2Mb≥ 64Kb≥ 8Kb≥ 0MbQuản lý bởi OSYesYesNoNoNoKhông gian địa chỉ riêngYesNoNoNoNoPre-emptive scheduleCóYesNoNoKhả năng bài hátCóYesNoYesNoCâu hỏi là. Vậy coroutine làm việc như thế nào? Làm thế nào để cài đặt một coroutine?Về cơ bản, nó cố gắng lưu lại trạng thái của hàm trong biến 1 và biến 2 đóng vai trò như là ngắt. Trước khi tạm dừng hàm(tạm dừng), biến 2 được đặt là điểm bắt đầu khi nó được khôi phục(tiếp tục)Trong đoạn mã này, điểm chính là biến 2 và cách mà mã có thể tiếp tục và tạm dừng coroutine bằng cách sử dụng 5Và ở bên dưới, nó được chuyển sang mã Python từ mã C ở trên
Bạn có thể chuyển mã Python này sang C không?
Sau đó, bạn nên xem kết nối quản trị như thế này
Mình có thể build bất kỳ coroutine nào trong C. Bạn có thể làm được điều đó không?
0Kết quả có thể thấy 1Chúng ta có thể thấy rằng, coroutine cần một khoảng trống bộ nhớ tĩnh để lưu lại trạng thái khi nó tạm dừng và khôi phục lại mà không bị mất ngữ cảnh. Trong C, không gian tĩnh là các biến tĩnh, chúng được duy trì bởi hệ điều hành khi một hàm thoát. Trong Python, ngữ cảnh của hàm được lưu trữ trong các khung ngăn xếp Hãy nghĩ về các quy trình như là các giai đoạn của một chương trình, không có bộ nhớ riêng, không thực hiện bài hát và cực kỳ an toàn Coroutine vs Chủ đềCoroutine giảm thiểu các lỗi do lí đa tiến trình (đa luồng) gây ra và mình nghĩ nó là giải pháp tốt nhất cho các nhiệm vụ liên quan đến mạng bởi nó chỉ tồn tại trong 1 tiến trình Trong Python, chúng ta có thể định nghĩa coroutine bằng việc sử dụng lệnh 6 trong định nghĩa hàm. Khi chúng ta gọi hàm, chúng ta trả về một coroutine thay vì kết quả cuối cùngSau đó, kết quả có thể được tìm thấy 3Trình tạo là một trường hợp đặc biệt của coroutine, chúng chỉ có thể sinh (sản xuất) dữ liệu mà không thể tiêu thụ (tiêu thụ) dữ liệu 4 5And here is results 6Chúng ta có thể cấu trúc lại đoạn mã với 7 0Xây dựng cây nhị phân với 0 1 1 2 3 5 8 13 21 34
|