Hướng dẫn why do we need async await in python? - tại sao chúng ta cần chờ đợi async trong python?

Và cải thiện hiệu suất mã I/O của bạn.

Ảnh của Clément Hélardot trên unplash

Vì Python 3.5, có thể sử dụng sự không đồng bộ trong các tập lệnh của bạn. Sự phát triển này cho phép sử dụng các từ khóa mới asyncawait cùng với mô -đun mới Asyncio.ince Python 3.5, it is possible to use asynchronism in your scripts. This evolution allowed the use of new keywords async and await along with the new module asyncio.

ASYNC và AIDIT trước tiên được giới thiệu trong C#, để cấu trúc mã không chặn theo cách tương tự như bạn sẽ viết mã chặn. Các từ khóa này sau đó được xuất sang một số ngôn ngữ lập trình vì nó tạo điều kiện cho việc quản lý mã không đồng bộ.

Thật vậy, có nhiều cách viết mã không đồng bộ khác, nếu bạn biết javascript/nodejs thì có lẽ bạn đã sử dụng các cuộc gọi lại:

fs = require('fs');
fs.writeFile('hello.txt', 'call back exemple in nodejs', (err) => {
if (err) return console.log(err);
console.log('file writen');
});

Hàm gọi lại được thông qua ở vị trí thứ hai ở đây sẽ được gọi là khi sự kiện đang diễn ra

Sau đó, cũng có những lời hứa cho phép quản lý tốt hơn các cuộc gọi không đồng bộ bằng các từ biểu cảm:

import axios from 'axios'let data;
axios.get("https://jsonplaceholder.typicode.com/posts")
.then(resp => {
data = resp.data //do data processing as data is actually available
})
.catch(err => { console.log(err) })
console.log(data) // undefined even if the instruction is after the API call

Một trong những vấn đề với các kỹ thuật này là chúng ta thoát khỏi luồng đọc ngang của mã ảnh hưởng đến khả năng đọc. Dù sao đi nữa, hãy để Lùi trở lại với cách nó tác động đến bạn như một người dùng Python.

Vấn đề với mã IO tiêu chuẩn trong Python.

Mã IO là một hướng dẫn sẽ gọi dịch vụ bên ngoài. Ví dụ, điều này có thể là yêu cầu HTTP hoặc cuộc gọi đến cơ sở dữ liệu. Vấn đề với mã Python tiêu chuẩn là mã của bạn nếu nó chỉ gọi các dịch vụ này, sẽ phải đợi cho đến khi các dịch vụ này trả lời trước khi tiếp tục hướng dẫn tiếp theo.

import requestsdata = (requests
.get("https://jsonplaceholder.typicode.com/posts")
.json()
) # blocking code block, python waiting doing nothing
for d in data: # executed once the API has return
print(d)

Trong ví dụ trên, nó không gây khó chịu lắm vì chỉ có một cuộc gọi đến dịch vụ bên ngoài nhưng hãy để Lừa lấy mã bên dưới.

def fetch_comments():
data = []
for i in range(1, 500):
url = f"https://jsonplaceholder.typicode.com/comments/{i}"
resp = requests.get(url).json()
data.append(resp)
fetch_comments()

Mã này mất 126,95 giây để hoàn thành trên máy của tôi. Do đó, chúng ta có thể thấy rằng nó không tối ưu. Chúng ta cần giới thiệu song song, tức là thực hiện một số yêu cầu cùng một lúc.126.95 seconds to complete on my machine. We can therefore see that it is not optimal. We need to introduce parallelism, i.e. perform several requests at the same time.

Cách cổ điển: Chủ đề

Trước sự xuất hiện của Asyncio trong Python, để xử lý loại vấn đề này, bạn phải sử dụng các chủ đề. Một chủ đề là một thành phần của một quá trình có thể được quản lý đồng thời. Tuy nhiên, Python có khóa phiên dịch toàn cầu giới hạn việc sử dụng các luồng để hướng dẫn không sử dụng mã được giải thích. Đây không phải là trường hợp ở đây vì chúng tôi sử dụng một dịch vụ bên ngoài. Không có thêm ADO ở đây là phiên bản chủ đề của mã gọi API.

Phiên bản chủ đề của API Call Nguồn: Tác giả

Có thể thấy, phiên bản ren của mã đòi hỏi nhiều nỗ lực hơn phiên bản đồng bộ. Thật vậy, chúng ta phải quản lý một hàng đợi cho phép các chủ đề chọn các URL khác nhau để xử lý.

Mặt khác, trên máy của tôi, việc thực hiện mã này với 5 luồng được sinh ra chỉ mất 7,05 giây để hoàn thành, giảm 94% so với phiên bản đồng bộ. Nhưng nếu tôi nói với bạn rằng chúng ta có thể làm tốt hơn.7.05 seconds to complete, a reduction of 94% compared to the synchronous version. But if I tell you that we can do better.

Cách hiện đại: Mã không đồng bộ

Hãy cùng xem cách thực hiện các cuộc gọi API với mã Async.

Phiên bản ASYNC của API Call Nguồn: Tác giả

Ở đây cũng vậy, có nhiều nỗ lực hơn để tạo ra để có được kết quả giống như phiên bản đồng bộ và ít nhất là nhiều nỗ lực như phiên bản với các chủ đề thì nó có đáng giá không? Trên máy của tôi, mã này mất 0,4880 giây để hoàn thành, bạn nói với tôi.0.4880 seconds to complete, you tell me.

Vậy tại sao phiên bản Async hoạt động tốt so với chủ đề? Bởi vì việc sinh sản và quản lý các luồng không miễn phí trong khi phiên bản không đồng bộ không cần phải quản lý các cơ chế này.

Sự kết luận

Bài viết này nhằm cho bạn thấy mã không đồng bộ có thể cải thiện hiệu suất của một số nhiệm vụ của bạn như thế nào. Có rất nhiều hướng dẫn trên web để tìm hiểu cách sử dụng mô hình mới này trong Python.

Mặc dù Async đã được hỗ trợ trong Python trong một vài năm, bạn phải nhớ rằng không phải tất cả các thư viện cũ hỗ trợ Async vì nó ngụ ý phải viết lại mã. Ví dụ: bạn phải nhận thấy rằng tôi không thể sử dụng các yêu cầu trong ví dụ async nhưng aiohttp mà phiên bản không đồng bộ tương đương

Nếu bạn bị thuyết phục và muốn chuyển sang Async, kho lưu trữ AIO-LIBS cung cấp một tập hợp các thư viện dựa trên asyncio và họ có thể có một thư viện phù hợp với nhu cầu của bạn.

Một lợi ích của việc sử dụng Async đang chờ đợi là gì?

Một lợi ích đáng kể của mẫu Async/Await bằng các ngôn ngữ hỗ trợ rằng mã không đồng bộ, không chặn có thể được viết, với chi phí tối thiểu và trông gần giống như mã chặn đồng bộ, đồng bộ.asynchronous, non-blocking code can be written, with minimal overhead, and looking almost like traditional synchronous, blocking code.

Ưu điểm của Async đang chờ đợi lợi thế là gì?

Lợi ích chính của lập trình không đồng bộ bằng cách sử dụng Async / AIDS bao gồm những điều sau: Tăng hiệu suất và khả năng đáp ứng của ứng dụng của bạn, đặc biệt khi bạn có các hoạt động dài không yêu cầu chặn thực thi.Increase the performance and responsiveness of your application, particularly when you have long-running operations that do not require to block the execution.