Hướng dẫn Lập Trình Bất Đồng Bộ trong Python - Phần 5 của Chuỗi Python Guru
Xin chào các bạn! Trong phần trước của chuỗi bài viết Python Guru, chúng ta đã cùng nhau khám phá các phương pháp để thực hiện lập trình đồng thời (concurrency) trong Python. Hôm nay, chúng ta sẽ tiếp tục với một chủ đề thú vị: lập trình bất đồng bộ (asynchronous programming) trong Python.
1. Khái Niệm về Lập Trình Đồng Bộ và Bất Đồng Bộ
Lập Trình Đồng Bộ
Trong lập trình truyền thống, các tác vụ được thực hiện lần lượt. Điều này có nghĩa là một tác vụ phải hoàn tất trước khi bắt đầu tác vụ tiếp theo. Phương pháp này, mặc dù đơn giản, nhưng có thể dẫn đến hiệu suất kém khi có nhiều tác vụ I/O bị chặn lại.
Lập Trình Bất Đồng Bộ
Ngược lại, lập trình bất đồng bộ cho phép mã nguồn thực hiện nhiều tác vụ đồng thời mà không làm chậm luồng chính (main thread) của chương trình. Điều này đặc biệt quan trọng trong các tác vụ I/O-bound như gửi yêu cầu API, truy vấn cơ sở dữ liệu, hay thực hiện các thao tác đọc/ghi tệp.
2. Các Thành Phần Của Lập Trình Bất Đồng Bộ Trong Python
2.1 Coroutine
Kể từ Python 3.4, thư viện asyncio đã cung cấp cho chúng ta công cụ lập trình bất đồng bộ hiệu quả. Coroutine là khái niệm quan trọng trong lập trình bất đồng bộ, cho phép các hàm tạm dừng và tiếp tục thực thi tại các thời điểm khác nhau. Sử dụng cú pháp async def
, chúng ta có thể định nghĩa một hàm bất đồng bộ và sử dụng từ khóa await
để chờ đợi các kết quả mà không chặn luồng chính.
2.2 Event Loop
Event loop là bộ não điều phối cho toàn bộ các coroutine trong một chương trình Python. Nó quản lý việc lên lịch các hoạt động, thực thi các coroutine và xử lý các hoạt động I/O mà không làm tắc nghẽn luồng chính. Hãy tưởng tượng rằng event loop giống như một người bếp trưởng quản lý hoạt động của nhà hàng, đảm bảo mọi khách hàng đều được phục vụ đúng lúc.
2.3 FastAPI
FastAPI tận dụng hiệu quả coroutine và event loop để phát triển các ứng dụng web Python hiệu suất cao. Khi bạn khởi động một ứng dụng FastAPI, nó sẽ tạo ra một event loop để xử lý hàng ngàn yêu cầu đồng thời mà không cần phải tạo ra nhiều thread hay process. Điều này giúp tối ưu hóa khả năng của lập trình bất đồng bộ, đặc biệt trong các tác vụ I/O-bound.
3. Một Số Lỗi Phổ Biến Khi Lập Trình Bất Đồng Bộ
3.1 Quên Sử Dụng Await
Khi khai báo một hàm bất đồng bộ mà không dùng await
để chờ kết quả của một coroutine khác, mã sẽ không thực hiện bất đồng bộ.
3.2 Chặn Event Loop
Thực hiện các tác vụ đồng bộ trong hàm async có thể khiến event loop bị chặn, làm giảm hiệu suất.
3.3 Quên Đóng Event Loop
Không đóng event loop sau khi hoàn thành các tác vụ có thể dẫn đến rò rỉ tài nguyên. Sử dụng asyncio.run()
để đóng tự động hoặc gọi loop.close()
thủ công.
4. Kết Luận
Trong bài viết này, chúng ta đã tìm hiểu cách thức lập trình bất đồng bộ trong Python, bao gồm cách sử dụng asyncio, coroutine, event loop và các lỗi thường gặp trong quá trình lập trình. Cảm ơn các bạn đã dành thời gian đọc bài viết. Chúc bạn thành công trong hành trình lập trình Python!
Cảm ơn và hẹn gặp lại trong các phần tiếp theo của chuỗi bài viết Python Guru!
Happy coding!
source: viblo