PYTHON CONCURRENCY
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thứ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:

Screenshot 202024 07 26 20003404 png

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ẽ.

Cùng chuyên mục:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top