Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Tìm hiểu Event loop trong Python
Trong bài viết này, bạn sẽ học về vòng lặp sự kiện (event loop) trong Python và cách Python sử dụngevent loop để đạt được mô hình đồng thời (concurrency) chỉ với một luồng đơn (single thread). Bạn sẽ tìm hiểu cách thức hoạt động của gói tích hợp asyncio để chạy các tác vụ đồng thời, cho phép bạn tối ưu hóa hiệu suất và quản lý các tác vụ I/O hiệu quả hơn. Bằng cách hiểu và áp dụng event loop, bạn sẽ có thể xây dựng các ứng dụng Python hoạt động nhanh chóng và mượt mà, ngay cả khi xử lý nhiều tác vụ cùng một lúc.
Giới thiệu về Event loop trong Python
Đồng thời (concurrency) nghĩa là nhiều tác vụ có thể chạy cùng một lúc. Gói tích hợp asyncio cho phép bạn chạy các tác vụ đồng thời chỉ với một luồng đơn.
Để đạt được mô hình đồng thời với một luồng đơn, gói asyncio sử dụng một cấu trúc gọi là vòng lặp sự kiện (event loop). Để hiểu cách event loop hoạt động, hãy xem xét ví dụ về việc ghi dữ liệu vào một file.
Khi ghi dữ liệu vào một file, bạn thực hiện các bước sau:
Bài viết này được đăng tại [free tuts .net]
- Mở file
- Ghi dữ liệu vào file và chờ đợi cho đến khi hoàn thành
- Đóng file
Trong luồng này, bước thứ hai là tác vụ chặn (blocking). Nội bộ, nó hoạt động như sau:
- Hàm ghi dữ liệu vào file gửi dữ liệu đến hệ điều hành (OS).
- Hệ điều hành tiếp quản và bắt đầu ghi dữ liệu vào file.
- Hệ điều hành thông báo cho chương trình khi hoàn thành việc ghi file.
Để quản lý các thông báo, các hệ điều hành khác nhau sử dụng các hệ thống thông báo sự kiện khác nhau, ví dụ:
Hệ điều hành | Hệ thống thông báo sự kiện |
---|---|
Linux | epoll |
Windows | I/O completion port (IOCP) |
macOS | kqueue |
Những hệ thống thông báo sự kiện này cho phép chúng ta đạt được đồng thời bằng cách sử dụng một luồng đơn. Trong khi chương trình chờ đợi hệ điều hành thông báo hoàn thành, nó có thể chạy mã khác.
Trong mô hình đồng thời với một luồng đơn, chúng ta chỉ có một luồng thực thi mã Python tại bất kỳ thời điểm nào. Khi gặp một tác vụ I/O-bound, chúng ta giao nó cho hệ thống thông báo sự kiện của hệ điều hành và chạy mã khác.
Khi tác vụ I/O-bound hoàn thành, chúng ta có thể tiếp tục tác vụ đang chờ kết quả và thực thi mã tiếp theo sau tác vụ I/O-bound đó.
Để theo dõi các tác vụ I/O-bound đang chờ kết quả, gói asyncio sử dụng event loop. Dưới đây là cách event loop hoạt động:
Cách hoạt động
- Luồng chính gửi các tác vụ vào hàng đợi tác vụ.
- Event loop liên tục theo dõi hàng đợi tác vụ và chạy tác vụ cho đến khi gặp các tác vụ I/O. Trong trường hợp này, event loop tạm dừng tác vụ và giao nó cho hệ điều hành.
- Kiểm tra các tác vụ I/O đã hoàn thành. Nếu tác vụ hoàn thành, hệ điều hành sẽ thông báo cho chương trình. Event loop sau đó chạy các tác vụ chưa được tạm dừng.
Các bước này lặp đi lặp lại cho đến khi hàng đợi tác vụ trống.
Trước Python 3.7, bạn cần tạo một event loop và chạy các tác vụ thủ công. May mắn thay, sau Python 3.7, gói asyncio cung cấp một số hàm cho phép bạn quản lý event loop tự động, vì vậy bạn không cần phải xử lý API cấp thấp.
Trong bài hướng dẫn tiếp theo, bạn sẽ học cách định nghĩa các coroutines bằng cách sử dụng từ khóa async
và tạm dừng chúng bằng từ khóa await
.
Kết bài
Sử dụng event loop là một cách hiệu quả để đạt được đồng thời trong Python mà không cần đến nhiều luồng. Bằng cách sử dụng gói asyncio, bạn có thể quản lý các tác vụ I/O-bound một cách hiệu quả hơn, giúp chương trình của bạn hoạt động mượt mà và tối ưu hơn. Điều này đặc biệt hữu ích trong các ứng dụng cần xử lý nhiều tác vụ I/O cùng lúc như các ứng dụng web, xử lý file, và kết nối mạng. Với sự trợ giúp của asyncio và event loop, bạn có thể tận dụng tối đa khả năng của Python để xây dựng các ứng dụng hiệu quả và mạnh mẽ.