3 điểm bởi GN⁺ 2024-05-09 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp
  • Asyncio là một cách tốt để xử lý các chương trình I/O-bound trong Python, về cơ bản cung cấp một lớp trừu tượng tốt dựa trên Python Generator
  • Generator giúp mã tiết kiệm bộ nhớ và có thể tạm dừng rồi tiếp tục hàm bằng từ khóa yield
  • Khi dùng yield from, generator có thể gọi sub-generator hoặc đối tượng iterable để tạo thành chuỗi generator

Vòng lặp sự kiện

  • Cốt lõi của Asyncio là event loop chạy và quản lý task hiện tại
  • Event loop lặp qua danh sách task và chạy từng task bằng next(task)
  • Trong lúc thực hiện tác vụ I/O, task dùng yield để tạm dừng thực thi và trả quyền điều khiển lại cho event loop

Ngủ chờ

  • Có thể thêm sub-generator vào task bằng yield from
  • Khi thêm sleep generator, có thể tạm dừng việc thực thi task cho đến thời điểm đã chỉ định
  • Khi Sleep thoát khỏi vòng lặp while, ngoại lệ StopIteration sẽ xảy ra và yield from trong hàm task sẽ tiếp tục sang dòng mã tiếp theo

Từ Yield sang Await

  • Có thể chuyển từ yield sang await bằng dunder method __await__ và từ khóa async
  • Từ khóa await có thể gọi phương thức __await__ của instance lớp hoặc được dùng trong coroutine (đối tượng được tạo bởi hàm async)
  • Có thể xem từ khóa await là từ đồng nghĩa của yield from, với một vài quy tắc kiểm tra tính hợp lệ bổ sung
  • Tạo lớp Task riêng để triển khai phương thức __await__, rồi thêm task được tạo bằng hàm create_task vào event loop
  • Trình quản lý event loop chạy task và đánh dấu task hoàn tất khi xảy ra ngoại lệ StopIteration
  • Hàm Sleep cũng cần được sửa để tương thích với async

AsyncIO và Await

  • Trong đoạn mã trên, nếu thay "jacobio" bằng "asyncio" thì sẽ sử dụng hoàn toàn gói asyncio
  • Asyncio làm được nhiều việc hơn, nhưng vẫn có thể tái hiện phần cốt lõi của asyncio từ generator cơ bản ngay từ đầu
  • Trong gói asyncio thực tế, có thể dùng các hàm như asyncio.gather() để xử lý nhiều task

Ý kiến của GN⁺

  • Bài viết này giải thích dễ hiểu nguyên lý hoạt động của asyncio bằng generator, nên sẽ rất hữu ích cho các lập trình viên mới tiếp cận asyncio
  • Asyncio là thư viện được tối ưu cho xử lý I/O hiệu năng cao, và nếu hiểu cấu trúc bên trong của nó qua bài viết này thì có thể áp dụng hiệu quả hơn trong các dự án thực tế
  • Tuy vậy, asyncio thực tế có cấu trúc phức tạp hơn nhiều, nên để dùng trong công việc thực tế vẫn cần học sâu hơn qua tài liệu chính thức và các nguồn khác
  • Các thư viện khác cung cấp tính năng tương tự Asyncio gồm có Trio, Curio..., và việc so sánh điểm khác biệt giữa chúng cũng sẽ rất thú vị
  • Khi đưa Asyncio vào sử dụng, có nhiều yếu tố cần cân nhắc như khả năng tương thích với mã đồng bộ hiện có, xử lý lỗi, kiểm thử..., vì vậy cần xem xét và chuẩn bị kỹ

Chưa có bình luận nào.

Chưa có bình luận nào.