Hướng dẫn is python asynchronous by default? - python không đồng bộ theo mặc định?


asyncio is a library to write concurrent code using the async/await syntax.

asyncio is used as a foundation for multiple Python asynchronous frameworks that provide high-performance network and web-servers, database connection libraries, distributed task queues, etc.

asyncio is often a perfect fit for IO-bound and high-level structured network code.

asyncio provides a set of high-level APIs to:

  • run Python coroutines concurrently and have full control over their execution;

  • perform network IO and IPC;

  • control subprocesses;

  • distribute tasks via queues;

  • synchronize concurrent code;

Additionally, there are low-level APIs for library and framework developers to:

  • create and manage event loops, which provide asynchronous APIs for networking, running subprocesses, handling OS signals, etc;

  • implement efficient protocols using transports;

  • bridge callback-based libraries and code with async/await syntax.

Availability: not Emscripten, not WASI.

This module does not work or is not available on WebAssembly platforms wasm32-emscripten and wasm32-wasi. See WebAssembly platforms for more information.

Reference

Note

The source code for asyncio can be found in Lib/asyncio/.

asyncio không đồng bộ vì coroutines hợp tác tự nguyện. Tất cả các mã asyncio phải được viết với sự hợp tác trong tâm trí, đó là điểm hoàn toàn. Nếu không, bạn cũng có thể sử dụng luồng chỉ để đạt được sự đồng thời.All asyncio code must be written with cooperation in mind, that's the point entirely. Otherwise you may as well use threading exclusively to achieve concurrency.

Bạn không thể chạy các chức năng 'chặn' (các chức năng hoặc phương thức không phải là công ty Hoặc ngay cả khi nó cần được chạy trong một người thực thi.can be run in a separate executor thread. Or even if it needs to be run in an executor.

Thư viện tiêu chuẩn Python có đầy đủ các mã thực sự hữu ích, mà các dự án asyncio sẽ muốn sử dụng. Phần lớn thư viện tiêu chuẩn bao gồm chức năng và định nghĩa lớp 'thường xuyên,' chặn '. Họ làm công việc của họ một cách nhanh chóng, vì vậy mặc dù họ 'chặn', họ trở lại trong thời gian hợp lý.

Nhưng hầu hết mã đó cũng không an toàn cho luồng, nó không cần phải có. Nhưng ngay khi asyncio sẽ tự động chạy tất cả mã đó trong một người thực thi, thì bạn không thể sử dụng các chức năng không an toàn không có luồng nữa. Bên cạnh đó, việc tạo một luồng để chạy mã đồng bộ là không miễn phí, việc tạo ra thời gian đối tượng chủ đề và hệ điều hành của bạn sẽ không cho phép bạn chạy số lượng luồng vô hạn. Vô số các chức năng và phương thức thư viện tiêu chuẩn rất nhanh, tại sao bạn muốn chạy str.splitlines() hoặc subprocesses0 trong một luồng riêng biệt khi nó sẽ nhanh hơn nhiều khi chỉ thực thi mã và được thực hiện với nó?

Bạn có thể nói rằng các chức năng đó không bị chặn bởi các tiêu chuẩn của bạn. Bạn đã không định nghĩa 'chặn' ở đây, nhưng 'chặn' chỉ có nghĩa là: sẽ không tự nguyện mang lại .. nếu chúng ta thu hẹp điều này để không tự nguyện mang lại khi nó phải chờ một cái gì đó và máy tính có thể làm việc khác Thay vào đó, sau đó câu hỏi tiếp theo sẽ là làm thế nào bạn sẽ phát hiện ra rằng nó nên mang lại?should have yielded?

Câu trả lời cho điều đó là bạn không thể. subprocesses1 là một chức năng chặn nơi bạn muốn mang lại cho vòng lặp, nhưng đó là một cuộc gọi chức năng C. Python không thể biết rằng subprocesses1 sẽ bị chặn lâu hơn, bởi vì một hàm gọi subprocesses1 sẽ tra cứu tên subprocesses4 trong không gian tên toàn cầu, và sau đó là thuộc tính subprocesses5 về kết quả tra cứu tên, chỉ khi thực sự thực hiện subprocesses1 biểu hiện. Bởi vì không gian tên của Python có thể được thay đổi tại bất kỳ điểm nào trong quá trình thực thi, bạn không thể biết subprocesses1 sẽ làm gì cho đến khi bạn thực sự thực thi chức năng.

Bạn có thể nói rằng việc triển khai subprocesses1 sẽ tự động mang lại khi được gọi sau đó, nhưng sau đó bạn phải bắt đầu xác định tất cả các chức năng như vậy. Và không có giới hạn về số lượng địa điểm bạn phải vá và bạn không bao giờ biết tất cả các địa điểm. Chắc chắn không phải cho các thư viện của bên thứ ba. Ví dụ: dự án subprocesses9 cung cấp cho bạn kết nối USB đồng bộ với thiết bị Android, sử dụng thư viện OS signals0. Đó không phải là một codepath I/O tiêu chuẩn, vậy làm thế nào Python biết rằng việc tạo và sử dụng các kết nối đó là nơi tốt để mang lại?

Vì vậy, bạn không thể cho rằng mã cần được chạy trong một người thực thi, không phải tất cả mã có thể được chạy trong một người thực thi vì nó không an toàn cho luồng và Python không thể phát hiện khi mã bị chặn và thực sự nên mang lại.

Vậy làm thế nào để coroutines theo asyncio hợp tác? Bằng cách sử dụng các đối tượng tác vụ trên mỗi đoạn mã logic cần chạy đồng thời với các tác vụ khác và bằng cách sử dụng các đối tượng trong tương lai để báo hiệu cho nhiệm vụ mà đoạn mã logic hiện tại muốn nhượng quyền kiểm soát sang các tác vụ khác. Đó là những gì làm cho mã asyncio không đồng bộ không đồng bộ, không đồng bộ, tự nguyện nhượng lại. Khi vòng lặp trao quyền kiểm soát một nhiệm vụ trong số nhiều nhiệm vụ, nhiệm vụ sẽ thực hiện một 'bước' của chuỗi cuộc gọi coroutine, cho đến khi chuỗi cuộc gọi đó tạo ra một đối tượng trong tương lai, tại đó, nhiệm vụ sẽ thêm một cuộc gọi đánh thức vào đối tượng trong tương lai 'được thực hiện 'Danh sách gọi lại và trả về điều khiển cho vòng lặp. Tại một số thời điểm sau đó, khi tương lai được đánh dấu thực hiện, cuộc gọi lại đánh thức được chạy và nhiệm vụ sẽ thực hiện một bước callchain coroutine khác.

Một cái gì đó khác chịu trách nhiệm đánh dấu các đối tượng trong tương lai như đã thực hiện. Khi bạn sử dụng OS signals3, một cuộc gọi lại sẽ được chạy vào một thời điểm cụ thể được đưa ra cho vòng lặp, trong đó cuộc gọi lại đó sẽ đánh dấu tương lai OS signals3 như đã thực hiện. Khi bạn sử dụng một đối tượng luồng để thực hiện I/O, sau đó (trên Unix), vòng lặp sử dụng các cuộc gọi OS signals5 để phát hiện khi đến lúc đánh thức một đối tượng trong tương lai khi hoạt động I/O được thực hiện. Và khi bạn sử dụng khóa hoặc nguyên thủy đồng bộ hóa khác, thì nguyên thủy đồng bộ hóa sẽ duy trì một đống tương lai để đánh dấu là 'thực hiện' khi thích hợp (chờ khóa? Thêm một tương lai vào đống. Tương lai từ đống và đánh dấu nó như đã thực hiện, vì vậy nhiệm vụ tiếp theo đang chờ khóa có thể thức dậy và có được khóa, v.v.).

Đặt mã đồng bộ chặn vào một giám đốc điều hành chỉ là một hình thức hợp tác khác ở đây. Khi sử dụng asyncio trong một dự án, tùy thuộc vào nhà phát triển để đảm bảo rằng bạn sử dụng các công cụ được cung cấp cho bạn để đảm bảo coroutines của bạn hợp tác. Bạn có thể tự do sử dụng chặn các cuộc gọi OS signals7 trên các tệp thay vì sử dụng các luồng và bạn có thể tự do sử dụng người thực thi khi bạn biết mã cần được chạy trong một luồng riêng để tránh chặn quá lâu.

Cuối cùng nhưng không kém phần quan trọng, toàn bộ điểm sử dụng asyncio là tránh sử dụng luồng càng nhiều càng tốt. Sử dụng các chủ đề có nhược điểm; Mã cần phải an toàn chủ đề (điều khiển có thể chuyển đổi giữa các luồng ở bất cứ đâu, do đó, hai luồng truy cập vào một phần dữ liệu được chia sẻ sẽ làm như vậy một cách cẩn thận và 'chăm sóc' có thể có nghĩa là mã bị chậm lại). Chủ đề thực thi bất kể họ có bất cứ điều gì để làm hay không; Chuyển đổi kiểm soát giữa một số lượng cố định các luồng mà tất cả đang chờ I/O xảy ra là một sự lãng phí thời gian CPU, trong đó vòng lặp asyncio được tự do tìm một nhiệm vụ không chờ đợi.

Python là đồng bộ hay không đồng bộ?

Có hai loại phương pháp cơ bản trong API Python Parallels: đồng bộ và không đồng bộ. Khi một phương thức đồng bộ được gọi, nó sẽ hoàn thành thực thi trước khi trả lại cho người gọi. Một phương thức không đồng bộ bắt đầu một công việc trong nền và trả lại cho người gọi ngay lập tức.synchronous and asynchronous. When a synchronous method is invoked, it completes executing before returning to the caller. An asynchronous method starts a job in the background and returns to the caller immediately.

Python có không đồng bộ không?

Asyncio được sử dụng làm nền tảng cho nhiều khung không đồng bộ của Python cung cấp mạng hiệu suất cao và máy chủ web, thư viện kết nối cơ sở dữ liệu, hàng đợi nhiệm vụ phân tán, v.v. that provide high-performance network and web-servers, database connection libraries, distributed task queues, etc. asyncio is often a perfect fit for IO-bound and high-level structured network code.

Python nhận được async khi nào?

Python đã thêm hỗ trợ cho Async/đang chờ đợi với phiên bản 3.5 vào năm 2015 Thêm 2 từ khóa mới, Async và đang chờ đợi.TypeScript đã thêm hỗ trợ cho Async/đang chờ đợi với phiên bản 1.7 vào năm 2015. JavaScript đã thêm hỗ trợ cho ASYNC/AIDIT trong năm 2017 như là một phần của phiên bản JavaScript 2017 của ECMAScript.Rust đã thêm hỗ trợ cho Async/đang chờ đợi với phiên bản 1.39.version 3.5 in 2015 adding 2 new keywords, async and await . TypeScript added support for async/await with version 1.7 in 2015. Javascript added support for async/await in 2017 as part of ECMAScript 2017 JavaScript edition. Rust added support for async/await with version 1.39.

Yêu cầu Python không đồng bộ?

Chỉ cần sử dụng thư viện Python Asyncio tích hợp Python là đủ để thực hiện các yêu cầu không đồng bộ thuộc bất kỳ loại nào, cũng như cung cấp đủ tính lưu động để xử lý lỗi cụ thể và phức tạp., as well as providing enough fluidity for complex and usecase specific error handling.