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 thêm Progress Bar trong Python với chỉ một dòng Code

Cách thêm Progress Bar trong Python với chỉ một dòng Code

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Cách nạp dữ liệu Machine Learning từ File trong Python

Cách nạp dữ liệu Machine Learning từ File trong Python

Hướng dẫn sử dụng Google Sheets API với Python

Hướng dẫn sử dụng Google Sheets API với Python

Xây dựng  web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn viết Snake Game bằng Python

Hướng dẫn viết Snake Game bằng Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng Python Debugger với hàm breakpoint()

Cách sử dụng Python Debugger với hàm breakpoint()

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hỗ trợ Async trong Django 3.1

Hỗ trợ Async trong Django 3.1

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

Ý nghĩa của if __name__ ==

Ý nghĩa của if __name__ == "__main__" trong Python

Cách xóa phần tử trong danh sách Python

Cách xóa phần tử trong danh sách Python

Top