Năng suất từ coroutine Python
Đối với công việc tư vấn mà tôi đã làm, tôi đã sử dụng python asyncio và hiểu được khó khăn trong cú pháp đơn giản của nó. Phải mất khá nhiều thời gian để đọc blog và các ví dụ để hiểu cách thức hoạt động của nó. Chủ đề này áp đảo vì lịch sử của nó với các trình tạo / cú pháp coroutine cũ hơn và yêu cầu một số kiến thức cơ bản về một số khái niệm để hiểu rõ hơn Show
Tôi muốn chia sẻ những điều mình học được, điều này sẽ giúp hiểu được các nguyên tắc cơ bản cốt lõi với các định nghĩa ngắn gọn và các ví dụ mã đơn giản để giúp làm việc với asyncio dễ dàng hơn. . ) chủ đề 1) Giới thiệu Sau đây là tổng quan ngắn gọn về các thuật ngữ được sử dụng trong các chủ đề Đồng thời vs Song song
Đồng bộ hóa và không đồng bộ Đồng bộ hóa/Không đồng bộ là về cách tính toán/tác vụ được thực hiện trong ngữ cảnh của một Chủ đề duy nhất
vòng lặpTrình lặp là các đối tượng có thể được lặp lại (sử dụng __iter__ và __next__) một cách lười biếng list = [1, 2] máy phát điệnTrình tạo (Thông thường) là các trình lặp giúp đơn giản hóa sự phức tạp trong việc xây dựng trình lặp logic tùy chỉnh. Nó tạo ra một giá trị nhanh chóng cho mỗi lần chạy (ví dụ:. , nhà sản xuất lười biếng) Làm thế nào để tạo ra ? trình tạo là bất kỳ chức năng bình thường nào với câu lệnh import randomdef simple_generator():9 thay vì câu lệnh def magic_pot(start=1, end=1000):0 import randomdef simple_generator():9 là một từ khóa được sử dụng giống như import randomdef simple_generator(): Đối tượng trình tạo ví dụ tương tự có thể được tương tác với vòng lặp 'for' vì nó là một trình vòng lặp def magic_pot(start=1, end=1000): Chúng ta có thể tạo đường ống dẫn tương tự như đường ống Unix ________số 8PEP-380, ( def magic_pot(start=1, end=1000):4 được giới thiệu để đơn giản hóa đường ống của máy phát điện)
import randomdef simple_generator():1 quy trình
Coroutines giúp đạt được đa nhiệm/đồng thời hợp tác. Chúng là các chức năng/tác vụ giúp thực thi đồng thời bằng cách có khả năng tạm dừng và tiếp tục các tác vụ trong một luồng. (e. g. , I/O không đồng bộ và các dạng lập trình hướng sự kiện hoặc đa nhiệm hợp tác khác) Phát triển thành “Generator Coroutine”Trình tạo không có khả năng chấp nhận các đối số trong khi thực thi, điều này khiến cho việc kiểm soát luồng logic bên trong hàm trình tạo trở nên khó khăn (e. g. một coroutine A chờ phản hồi từ một cuộc gọi http khác coroutine B. Coroutine A tạm dừng -> Coroutine B Http Complete -> Tiếp tục Coroutine A (phản hồi http từ Coroutine B)) Trình tạo đã được phát triển để hỗ trợ các coroutine như khả năng sử dụng PEP-342 (Python 2. 5), giúp truyền tham số cho trình tạo để kiểm soát luồng thực thi. Điều này cuối cùng đã giúp đạt được các khả năng của coroutine, các hình thức đa nhiệm hợp tác khác PEP-342
Ở trên PEP đã thêm các cải tiến để thêm phương thức gửi (), ném (), đóng () cho trình tạo. import randomdef simple_generator():9 đã được thay đổi dưới dạng biểu thức và hoạt động như một công cụ giao tiếp hai chiều được giải thích trong ví dụ bên dưới import randomdef simple_generator():3 Coroutine vs Máy phát điệnCoroutine là một trình tạo tuân theo các quy ước nhất định
AsyncIO — I/O không đồng bộ, vòng lặp sự kiện, coroutines và tác vụTừ tài liệu Python
Quy trình tạo AsyncIOTrong trăn 3. 4, coroutines dựa trên trình tạo được tạo bằng trình trang trí def magic_pot(start=1, end=1000):7 bằng thư viện mô-đun asyncio mới. Các coroutine của trình tạo Asyncio sử dụng cú pháp def magic_pot(start=1, end=1000):5 để tạm dừng coroutine Một asyncio coroutine có thể
Câu lệnh def magic_pot(start=1, end=1000):5 từ bỏ quyền điều khiển trở lại vòng lặp sự kiện để cho các coroutine khác thực thi
import randomdef simple_generator():8 Coroutines bản địadef read_file(file_name):1 từ khóa được giới thiệu kể từ Python 3. 5 giúp ngữ pháp lập trình coroutine thêm ý nghĩa và cú pháp mới nhất
def magic_pot(start=1, end=1000):0 chờ đợi
def magic_pot(start=1, end=1000):4 Các Coroutine đồng thời (async/await, @asyncio. coroutine/năng suất từ) def magic_pot(start=1, end=1000):5 Câu lệnh coroutine compute() “yield from” từ bỏ quyền điều khiển trở lại vòng lặp sự kiện (tạm dừng) và tiếp tục thực thi sau khi coroutine def read_file(file_name):5 hoàn thành. Lưu ý rằng bản thân def read_file(file_name):5 là một quy trình đăng ký và quy trình đăng ký bị chặn sẽ tiếp tục sau khi ngủ. Vòng lặp sự kiện thực thi dựa trên các coroutine có thể chạy được và thứ tự thực hiện đầu ra (t1, t2, t3) thay đổi dựa trên độ trễ trong ví dụ Vòng lặp sự kiện
import randomdef simple_generator():0 tương laidef read_file(file_name):7 là một đối tượng có thể chờ ở mức độ thấp đặc biệt đại diện cho kết quả cuối cùng của hoạt động không đồng bộ. Đối tượng tương lai được chờ đợi, điều đó có nghĩa là coroutine sẽ đợi cho đến khi Tương lai được giải quyết ở một số nơi khác import randomdef simple_generator():1 Phối hợp giữa các hợp đồng tương lai import randomdef simple_generator():2 nhiệm vụNhiệm vụ là một lớp con của Tương lai. Các tác vụ được sử dụng để lên lịch cho các coroutine đồng thời trong vòng lặp sự kiện. Coroutine được bao bọc trong một Tác vụ với các chức năng như def read_file(file_name):8, coroutine sẽ tự động được lên lịch để chạy sớm. Tác vụ có add_done_callback() để xử lý thêm việc dọn dẹp mã/xử lý logic import randomdef simple_generator():3 @loại. công việc thường ngàyTrình trang trí để gắn cờ trình tạo là một coroutine. Rất giống với asyncio. coroutine() và ít được chú ý hơn. Nó cho phép khả năng tương tác giữa các coroutine dựa trên trình tạo hiện có trong asyncio và các coroutine gốc (không đồng bộ) import randomdef simple_generator():4 Máy phát điện không đồng bộ'yield' bên trong một coroutine gốc trả về một trình tạo không đồng bộ import randomdef simple_generator():5 Trình tạo có async/await được hỗ trợ với giao thức lặp không đồng bộ mới Giao thức lặp không đồng bộ
import randomdef simple_generator():6 không đồng bộ choĐơn giản hóa việc lặp lại trình tạo không đồng bộ (năng suất) import randomdef simple_generator():73. Tóm lược
import randomdef simple_generator():8 Người giới thiệu Đặc biệt Cảm ơn tất cả những người đã giúp tôi hiểu các khái niệm phức tạp với blog/bài thuyết trình chi tiết của họ. Tôi đã sử dụng một phần định nghĩa/ví dụ tham khảo từ một số liên kết tham khảo
Vui lòng cho tôi biết phản hồi/chỉnh sửa của bạn về định nghĩa/mã. Nếu bạn đang đọc dòng cuối cùng này, bạn đã có rất nhiều kiên nhẫn/quan tâm để đọc một bài viết dài như vậy và cảm ơn vì điều đó. ) Làm cách nào để trả về giá trị từ Python coroutine?Trả về giá trị từ Coroutines
. Trong trường hợp này, run_until_complete() cũng trả về kết quả của coroutine mà nó đang chờ.
Năng suất trong coroutine là gì?2. Khái niệm cơ bản. Điều đầu tiên cần biết về hàm yield() là nó là hàm tạm dừng được sử dụng trong ngữ cảnh của Kotlin Coroutines . Khi năng suất () được gọi, nó sẽ tạo ra luồng (hoặc nhóm luồng) của trình điều phối coroutine hiện tại cho các coroutine khác để chạy nếu có thể.
Chúng tôi có thể mang lại danh sách bằng Python không?Từ khóa suất, không giống như câu lệnh trả về, được sử dụng để biến một hàm Python thông thường thành trình tạo . Điều này được sử dụng thay thế cho việc trả lại toàn bộ danh sách cùng một lúc.
Sự khác biệt giữa máy phát điện và coroutine là gì?Trình tạo cho phép bạn tạo các hàm trông giống như trình vòng lặp đối với người tiêu dùng. Coroutine là một phần mở rộng của khái niệm chức năng truyền thống . Một hàm sẽ trao lại quyền điều khiển cho người gọi của nó một lần thông qua câu lệnh return. Một coroutine sẽ trả lại quyền kiểm soát nhiều lần bằng cách gọi năng suất. |