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:

Cách tạo một widget nhập ngày và giờ sử dụng PyQt QDateTimeEdit

Cách tạo một widget nhập ngày và giờ sử dụng PyQt QDateTimeEdit

Cách tạo một widget nhập giờ sử dụng lớp PyQt QTimeEdit

Cách tạo một widget nhập giờ sử dụng lớp PyQt QTimeEdit

Cách tạo một widget nhập ngày sử dụng lớp PyQt QDateEdit

Cách tạo một widget nhập ngày sử dụng lớp PyQt QDateEdit

Cách sử dụng widget PyQt QSpinBox để tạo một spin box

Cách sử dụng widget PyQt QSpinBox để tạo một spin box

Sử dụng PyQt QComboBox để tạo Widget Combobox

Sử dụng PyQt QComboBox để tạo Widget Combobox

Cách sử dụng lớp PyQt QRadioButton

Cách sử dụng lớp PyQt QRadioButton

Cách sử dụng lớp QCheckBox trong PyQt

Cách sử dụng lớp QCheckBox trong PyQt

Cách sử dụng QFormLayout trong PyQt

Cách sử dụng QFormLayout trong PyQt

Cách sử dụng QGridLayout trong PyQt

Cách sử dụng QGridLayout trong PyQt

Cách sử dụng QVBoxLayout trong PyQt

Cách sử dụng QVBoxLayout trong PyQt

Cách sử dụng widget QLineEdit trong PyQt

Cách sử dụng widget QLineEdit trong PyQt

Cách sử dụng widget QPushButton của PyQt

Cách sử dụng widget QPushButton của PyQt

Cách sử dụng widget PyQt QLabel

Cách sử dụng widget PyQt QLabel

Tín hiệu và Khe (Signals & Slots) trong PyQt

Tín hiệu và Khe (Signals & Slots) trong PyQt

PyQt là gì? Tạo một chương trình

PyQt là gì? Tạo một chương trình "Hello World".

Ứng dụng System Tray với Tkinter

Ứng dụng System Tray với Tkinter

Cách hiển thị đồ thị từ thư viện Matplotlib trong Tkinter

Cách hiển thị đồ thị từ thư viện Matplotlib trong Tkinter

Cách sử dụng Validate trong Tkinter

Cách sử dụng Validate trong Tkinter

Cấu trúc MVC trong Tkinter

Cấu trúc MVC trong Tkinter

Cách sử dụng widget PhotoImage của Tkinter

Cách sử dụng widget PhotoImage của Tkinter

Top