Cuộc gọi không đồng bộ trong Python

Bạn có biết rằng Python được coi là ngôn ngữ lập trình phổ biến nhất năm 2021? . Điều đó có ý nghĩa, coi Python là ngôn ngữ lập trình hoặc kịch bản phổ biến nhất cho tự động hóa và học máy, hai trong số các lĩnh vực CNTT phát triển nhanh nhất. Điều đó có nghĩa là Python đang thực hiện rất nhiều lệnh gọi API. Tuy nhiên, so với các ngôn ngữ lập trình khác, Python có thể chậm hơn nhiều khi thực hiện các lệnh gọi API đó

Tại sao vậy?

Theo thiết kế, Python là một ngôn ngữ chặn. Điều đó có nghĩa là mã Python sẽ không được thực thi cho đến khi bộ hướng dẫn trước đó kết thúc. Điều này cũng đúng với các cuộc gọi định nghĩa

Mặt khác, các ngôn ngữ lập trình như JavaScript là ngôn ngữ không chặn. Điều đó có nghĩa là nếu một đoạn mã đang chờ điều gì đó xảy ra, thì đoạn mã đó có thể giải phóng quyền kiểm soát trở lại trình thông dịch JavaScript để làm những việc khác

Khóa học trực tuyến

Bắt đầu với Python 3

  • 54 Video
  • Luyện thi
  • huấn luyện
  • câu đố

HÀNG THÁNG

USD/người học/tháng

HÀNG NĂM

USD/người học/tháng

Xem bây giờ

Điều này cải thiện đáng kể hiệu quả của JavaScript. Đó là do máy tính xử lý mã JavaScript không hoạt động. Thay vào đó, máy tính đó có thể sử dụng các chu kỳ bộ xử lý của nó cho các đoạn mã khác

Sẽ thật tuyệt nếu Python cũng có thể sử dụng các hàm không đồng bộ phải không?

Hóa ra Python có thể sử dụng mã không đồng bộ. Mặc dù có thể mất nhiều công sức hơn để tạo lệnh gọi lại trong Python so với trong JavaScript, một thư viện có tên Asyncio giúp viết mã Python không đồng bộ dễ dàng. Hãy thảo luận về cách

Tổng quan về cách tạo lệnh gọi API Async với Asyncio [Video]

Trong video này, Ben Finkel trình bày cách tạo lệnh gọi API không đồng bộ trong Python. Rất nhiều tài nguyên internet có các bài viết chi tiết thảo luận về tất cả thông tin chi tiết về lập trình đồng bộ và không đồng bộ, nhưng Ben tin rằng sẽ hữu ích hơn khi xem nó hoạt động và tìm hiểu cách nó có thể cải thiện khả năng đáp ứng của phần mềm của bạn

Làm cách nào để tạo Async Nhận yêu cầu trong Python?

Python, theo thiết kế, là một ngôn ngữ chặn. Điều đó có nghĩa là nó phải xử lý xong các dòng mã trước khi có thể chuyển sang các tác vụ khác. Điều này hoàn toàn trái ngược với các ngôn ngữ như JavaScript. Rất may, với một thư viện có tên là Asyncio, Python có thể sử dụng cùng một cú pháp async/await mà JavaScript sử dụng để tạo mã đồng thời

Trước khi đi xa hơn, chúng ta cần làm rõ một vài điều

Đầu tiên, Asyncio có rất nhiều công dụng khác nhau. Bài viết này không phải là một hướng dẫn đầy đủ về cách sử dụng tất cả các chức năng của Asyncio. Thay vào đó, nó chỉ nhằm trình bày cách sử dụng Asyncio trong Python để viết mã đồng thời, không chặn. Nếu bạn muốn xem tất cả các chức năng mà Asyncio có thể sử dụng, bạn nên đọc tài liệu của thư viện này tại Python. tổ chức

Thứ hai, chúng tôi cung cấp hai ví dụ mã Python bên dưới. Một ví dụ là để chứng minh cách Python sử dụng lệnh gọi async/await với Asyncio. Chúng tôi sẽ tham khảo bộ cú pháp ví dụ này trong suốt phần còn lại của bài viết này. Một đoạn mã ví dụ khác minh họa cách yêu cầu Nhận truyền thống được thực hiện bằng Python bằng cách sử dụng thư viện Requests Python. Một lần nữa, chúng tôi sẽ không tham khảo bộ mã này. Nó chỉ được đưa vào như một ví dụ để so sánh với mã không đồng bộ trông như thế nào trong Python

Thứ ba, vì chúng tôi sẽ tham khảo mã không đồng bộ trong suốt bài viết này, nên chúng tôi sẽ bao gồm các nhận xét tham chiếu trong ví dụ mã bên dưới. Chẳng hạn, chúng ta có thể tham khảo 'Tham chiếu 1 trong ví dụ về mã. ' Do đó, chúng tôi sẽ ghi chú Tham chiếu 1 bằng nhận xét trong mã ví dụ [ # Tham chiếu 1]

Thứ tư, kiểm tra kỹ ví dụ mã Python không đồng bộ. Bạn sẽ nhận thấy chức năng đầu tiên được gọi là 'count[]' nằm ở Tham chiếu 1 trong ví dụ về mã. Chúng tôi sẽ không thảo luận về chức năng này ngoài việc nói rằng mục tiêu của nó là đếm một lần một giây và sau đó hiển thị số đếm đó trong bảng điều khiển. Hàm này dùng làm ví dụ trực quan nếu bạn muốn xem mã Python không đồng bộ hoạt động như thế nào. Vui lòng sao chép và chạy ví dụ mã Python không đồng bộ bên dưới. Bạn nghĩ điều gì sẽ xảy ra?

Cách cài đặt Asyncio trong Python

Trước khi bạn có thể thực hiện cuộc gọi không đồng bộ và chờ đợi trong Python, bạn cần cài đặt thư viện Asyncio trong môi trường Python của mình. Điều này có thể được thực hiện với trình quản lý gói Pip của Python


Điều đó sẽ cho phép Asyncio khả dụng trong các dự án Python của bạn trong tương lai

Tiếp theo, bạn cần nhập thư viện Asyncio vào mã Python của mình [Tham khảo 2 trong ví dụ bên dưới]


Cuối cùng, với mục đích của bài viết này, chúng ta sẽ sử dụng hàm ClientSession từ mã lớp Aiohttp [Tham khảo 3 trong ví dụ bên dưới]


Aiohttp là gói máy chủ và máy khách HTTP không đồng bộ dành cho Python sử dụng Asyncio. Nếu bạn đã quen với Express cho NodeJS, bạn sẽ cảm thấy rất thoải mái với Aiohttp. Vì Aiohttp là một gói riêng biệt với Asyncio nên nó cũng phải được cài đặt thông qua trình quản lý gói Pip. Sử dụng lệnh cài đặt Pip tương tự ở trên nhưng thay thế 'asyncio' bằng 'aiohttp. '

Cách tạo Async Nhận yêu cầu bằng Python với Aiohttp

Trước khi sử dụng Aiohttp để thực hiện Nhận yêu cầu trong Python, trước tiên hãy đảm bảo cài đặt và nhập thư viện Asyncio vào dự án Python của bạn. Aiohttp là máy khách và máy chủ HTTP cho Python. Nó phụ thuộc vào Asyncio do tính chất không đồng bộ của HTTP Nhận yêu cầu

Việc sử dụng Aiohttp để thực hiện Nhận yêu cầu tùy thuộc vào các tính năng không đồng bộ và đang chờ của thư viện Asyncio. Điều này rất giống với JavaScript. Vì các hoạt động không đồng bộ trong Python không được tích hợp sẵn và phụ thuộc vào thư viện Asyncio, trước tiên chúng ta cần gọi một hàm của thư viện Asyncio để khởi động các hoạt động mã không đồng bộ [Tham khảo 4 trong ví dụ bên dưới]


Asyncio tận dụng tính chất chặn của Python để hoạt động. Về cơ bản, cuộc gọi chức năng này đang gọi một chức năng khác. Hàm thứ hai này [Tham chiếu 5 trong ví dụ bên dưới] là hàm mà sau đó chúng ta sử dụng để gọi phần còn lại của các hàm không đồng bộ


Hàm 'main[]' sử dụng một hàm khác của Asyncio để gọi cả hai hàm 'get_delay[]' và 'count[]'

Điều này có vẻ như rất nhiều công việc chỉ để gọi một vài chức năng không đồng bộ. Tuy nhiên, điều này là bắt buộc do cách Python được thiết kế. Vì bản chất Python là chặn, nên chúng ta cần gọi một hàm duy nhất sẽ được sử dụng để bắt đầu quá trình mã không đồng bộ

Bất kỳ chức năng nào không phải là chức năng async/await sẽ không được xử lý cho đến sau 'asyncio. run[main[]]' được thực hiện. Vì vậy, chẳng hạn, nếu bạn có chức năng khác sau 'asyncio. run[main[]]' cộng hai số lại với nhau [Tham khảo 6 trong ví dụ bên dưới], hàm đó sẽ không chạy cho đến khi tất cả các hàm async/await khác kết thúc từ 'asyncio. chạy [chính[]]'

Đây là một cách khác để hình dung cách mã async chạy trong Python

  1. không đồng bộ. run gọi hàm 'main[]'

  2. 'main[]' gọi cả 'get_delay[]' và 'count[]'

  3. Cả 'get_delay[]' và 'count[]' đều xử lý mã của chúng cùng lúc nhưng độc lập với nhau

  4. Cả 'get_delay[]' và 'count[]' đều kết thúc quá trình xử lý và trả lại mức độ ưu tiên cho 'main[]. '

  5. 'main[]' hiện đã kết thúc, do đó, nó sẽ trả lại quyền ưu tiên cho asyncio. chạy

  6. không đồng bộ. quá trình chạy hiện đã kết thúc, vì vậy phần còn lại của mã sẽ chạy [nếu không, 'addTwoNumbers[]' cuối cùng sẽ thực thi]

Hãy bỏ qua hàm 'count[]' và tập trung vào hàm 'get_delay[]'. Hàm 'get_delay[]' không phức tạp. Hãy đi qua nó

Đầu tiên, chức năng này xác định điểm cuối cho API mà nó muốn gọi. Sau đó, nó in một số văn bản ra bàn điều khiển. Văn bản đó không quan trọng. Nó chỉ có nghĩa là một hàng đợi trực quan mà chức năng 'get_delay[]' đang hoạt động

Tiếp theo, chúng tôi thực hiện cuộc gọi không đồng bộ bằng phương thức 'ClientSession[]' từ thư viện Aiohttp đó. Chúng tôi thiết kế đối tượng từ 'ClientSession[]' đơn giản là 'phiên. '

Trong cuộc gọi không đồng bộ đó, chúng tôi đặt giá trị của biến được gọi là 'phản hồi' thành phản hồi thực tế của yêu cầu Nhận HTTP do 'phiên. đọc[]'. 'phiên. read[]' biết URL API HTTP và điểm cuối nào sẽ sử dụng khi chúng tôi xác định 'phiên' bằng cách sử dụng 'ClientSession[]. '

Một khi 'phiên. read[]' nhận được tin nhắn trả lại từ 'http. //httpbin. org/delay/5', nó sẽ gán thông báo đó cho 'response. ' Sau đó, 'phản hồi' được in ra bàn điều khiển

Tất cả điều này đang xảy ra trong khi 'count[]' đang xử lý và cũng xuất số đếm của nó ra bảng điều khiển

from aiohttp import ClientSession
 base_url = '//httpbin.org'
 async def count[]
  for I in [1,2,3,4,5]:
  print[i]
  await asyncio.sleep[1]
 async def get_delay[seconds]
  endpoint = f'/delay/{seconds}'
  print[f'Getting with {seconds} delay … ']
  async with ClienSession[base_url+endpoint] as session:
   response = await response.read[]
   print[response]
 async def main[]:
  await asynchio.gather[get_delay[5],count[]]
 asyncio.run[main[]]
 def addTwoNumbers [x, y]:
  print[x + y]
 addTwoNumbers [2, 5]
 print['Okay! All finished getting.']

base_url = '//httpbin.org/'
def get_delay[seconds]:
 endpoint = f'/delay/{seconds}'
 print[f'Getting with {seconds} delay … ']
 resp = requests.get[base_url+endpoint]
 data = resp.json[]
 print[data]
get_delay[5]
print['Okay! All finished getting.']

kết thúc

Chúng tôi bao gồm rất nhiều thông tin trong video đó. Tuy nhiên, chúng tôi hầu như không tìm hiểu sơ qua về các hoạt động không đồng bộ trong Python hoặc đối với vấn đề đó, Python nói chung, trong bài viết này. Nếu bạn muốn tìm hiểu thêm về Python, hãy cân nhắc tham gia khóa học Tự động hóa với Python

Hãy tóm tắt lại những gì chúng ta đã nói về. Python là ngôn ngữ lập trình chặn theo thiết kế. Thật không may, nó không hiểu khái niệm mã không đồng bộ. Tuy nhiên, chúng ta có thể viết mã không đồng bộ bằng Python bằng cách sử dụng thư viện có tên là Asyncio

Python có một thư viện khác gọi là Aiohttp, đó là máy khách và máy chủ HTTP dựa trên Asyncio. Do đó, chúng ta có thể sử dụng Asyncio để tạo lệnh gọi API không đồng bộ

Điều này rất hữu ích để tối ưu hóa mã. Vì Python là ngôn ngữ chặn nên có thể gây ra thời gian nhàn rỗi chờ Python hoàn thành các tác vụ [như chờ lệnh gọi API]. Bằng cách sử dụng mã không đồng bộ, chúng tôi có thể giữ cho Python hoạt động liên tục mà không có thời gian nhàn rỗi

Tải xuống

Hướng dẫn chứng chỉ mạng cơ bản

Hướng dẫn dài 97 trang về mọi chứng chỉ của Cisco, Juniper, F5 và NetApp và cách chúng phù hợp với sự nghiệp của bạn

Tên đầu tiên

Yêu cầu

Họ

E-mail

Vai trò công việc của bạn là gì?

Gửi cho tôi tin tức và tài nguyên đào tạo CNTT về CBT Nuggets. [không bắt buộc]

Gửi đi

Bằng cách gửi biểu mẫu này, bạn đồng ý rằng bạn đã đọc, hiểu và có thể đồng ý với chính sách bảo mật của chúng tôi

Tại sao async được sử dụng trong Python?

Với lập trình không đồng bộ, chúng ta có thể thực thi các tác vụ đồng thời với việc thực thi chương trình chính . Các từ khóa không đồng bộ và chờ đợi đơn giản hóa việc lập trình không đồng bộ trong Python. Python có mô hình lập trình không đồng bộ được tích hợp trong ngôn ngữ.

Không đồng bộ cho vòng lặp Python là gì?

Biểu thức async for được dùng để duyệt một trình vòng lặp không đồng bộ . Nó là một câu lệnh vòng lặp for không đồng bộ. Một trình lặp không đồng bộ là một trình vòng lặp mang lại các giá trị có thể chờ đợi. trình lặp không đồng bộ. Một đối tượng triển khai các phương thức __aiter__[] và __anext__[]. __anext__ phải trả về một đối tượng có thể chờ đợi.

Chủ Đề