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.

Các coroutine trong Python

Trong bài viết này, bạn sẽ học cách sử dụng các coroutine trong Python và cách sử dụng các từ khóa asyncawait để tạo và tạm dừng các coroutine. Các coroutine giúp bạn viết mã không đồng bộ, cho phép chương trình thực hiện nhiều tác vụ đồng thời mà không cần phải đợi từng tác vụ hoàn thành trước khi chuyển sang tác vụ tiếp theo. Điều này không chỉ cải thiện hiệu suất của chương trình mà còn giúp mã dễ đọc và bảo trì hơn.

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ề coroutine trong Python

Coroutine là một hàm thông thường nhưng có khả năng tạm dừng thực thi khi gặp một thao tác mất nhiều thời gian để hoàn thành. Khi thao tác dài hoàn thành, bạn có thể tiếp tục thực thi coroutine và chạy phần còn lại của mã trong coroutine đó. Trong khi coroutine đang chờ thao tác dài hoàn thành, bạn có thể chạy các mã khác, giúp chương trình chạy không đồng bộ và cải thiện hiệu suất.

Để tạo và tạm dừng một coroutine, bạn sử dụng các từ khóa asyncawait trong Python:

  • Từ khóa async để tạo coroutine.
  • Từ khóa await để tạm dừng coroutine.

Định nghĩa coroutine với từ khóa async trong Python

Đầu tiên, định nghĩa một hàm đơn giản trả về bình phương của một số nguyên:

Bài viết này được đăng tại [free tuts .net]

def square(number: int) -> int:
    return number * number

Bạn có thể truyền một số nguyên vào hàm square() để lấy giá trị bình phương của nó:

result = square(10)
print(result)

Đầu ra:

100

Khi bạn thêm từ khóa async vào hàm, hàm này sẽ trở thành một coroutine:

async def square(number: int) -> int:
    return number * number

Khi gọi coroutine, Python sẽ không thực thi ngay lập tức mà trả về một đối tượng coroutine:

async def square(number: int) -> int:
    return number * number

result = square(10)
print(result)

Đầu ra:

<coroutine object square at 0x00000185C31E7D80>
sys:1: RuntimeWarning: coroutine 'square' was never awaited

Để chạy coroutine, bạn cần thực thi nó trên một vòng lặp sự kiện (event loop). Từ phiên bản Python 3.7, thư viện asyncio cung cấp hàm asyncio.run() để tự động tạo và quản lý vòng lặp sự kiện, thực thi coroutine và đóng vòng lặp sự kiện.

Ví dụ, sử dụng hàm asyncio.run() để thực thi coroutine square() và lấy kết quả:

import asyncio

async def square(number: int) -> int:
    return number * number

result = asyncio.run(square(10))
print(result)

Đầu ra:

100

Tạm dừng coroutine với từ khóa await trong Python

Từ khóa await dùng để tạm dừng thực thi của một coroutine. Nó được theo sau bởi một lời gọi đến một coroutine khác:

result = await my_coroutine()

Từ khóa await khiến my_coroutine() thực thi, chờ đợi kết quả và trả về kết quả khi hoàn thành.

Lưu ý rằng từ khóa await chỉ hợp lệ bên trong một coroutine. Điều này giải thích vì sao trong ví dụ trước, việc sử dụng từ khóa await bên ngoài coroutine đã gây ra lỗi.

Ví dụ, sử dụng từ khóa await để tạm dừng coroutine:

import asyncio

async def square(number: int) -> int:
    return number * number

async def main() -> None:
    x = await square(10)
    print(f'x={x}')

    y = await square(5)
    print(f'y={y}')

    print(f'total={x + y}')

if __name__ == '__main__':
    asyncio.run(main())

Đầu ra:

x=100
y=25
total=125

Kết bài

Coroutine là một hàm thông thường với khả năng tạm dừng một thao tác dài, chờ kết quả và tiếp tục từ điểm tạm dừng. Để định nghĩa một coroutine, bạn sử dụng từ khóa async. Để tạm dừng một coroutine và chờ kết quả, bạn sử dụng từ khóa await. Cuối cùng, để tự động thực thi một coroutine trên một vòng lặp sự kiện và quản lý vòng lặp sự kiện, bạn sử dụng hàm asyncio.run(). Với các từ khóa asyncawait, bạn có thể dễ dàng viết mã không đồng bộ trong Python, giúp cải thiện hiệu suất và khả năng quản lý của chương trình.

Cùng chuyên mục:

Cách sử dụng lớp QTreeWidget của PyQt

Cách sử dụng lớp QTreeWidget của PyQt

Cách sử dụng lớp QTableWidget để tạo một bảng

Cách sử dụng lớp QTableWidget để tạo một bảng

Cách sử dụng lớp QListWidget trong Python

Cách sử dụng lớp QListWidget trong Python

Cách dùng lớp QStatusBar trong PyQt để tạo thanh status bar

Cách dùng lớp QStatusBar trong PyQt để tạo thanh status bar

Cách dùng lớp QDockWidget của PyQt để tạo một widget

Cách dùng lớp QDockWidget của PyQt để tạo một widget

Cách dùng lớp PyQt QToolBar để tạo các widget toolbar

Cách dùng lớp PyQt QToolBar để tạo các widget toolbar

Cách sử dụng lớp PyQt QMenu để tạo menu

Cách sử dụng lớp PyQt QMenu để tạo menu

Cách sử dụng lớp QMainWindow của PyQt để tạo cửa sổ

Cách sử dụng lớp QMainWindow của PyQt để tạo cửa sổ

Cách dùng lớp PyQt QFileDialog để tạo hộp thoại chọn file

Cách dùng lớp PyQt QFileDialog để tạo hộp thoại chọn file

Cách dùng lớp PyQt QInputDialog để tạo một hộp thoại nhập liệu

Cách dùng lớp PyQt QInputDialog để tạo một hộp thoại nhập liệu

Cách sử dụng lớp PyQt QMessageBox để tạo một hộp thoại

Cách sử dụng lớp PyQt QMessageBox để tạo một hộp thoại

Cách sử dụng lớp PyQt QProgressBar để tạo một widget progress bar

Cách sử dụng lớp PyQt QProgressBar để tạo một widget progress bar

Cách dùng lớp PyQt QTextEdit để tạo một widget cho phép chỉnh sửa

Cách dùng lớp PyQt QTextEdit để tạo một widget cho phép chỉnh sửa

Cách dùng lớp PyQt QGroupBox để tạo một khung nhóm với tiêu đề

Cách dùng lớp PyQt QGroupBox để tạo một khung nhóm với tiêu đề

Cách dùng lớp PyQt QTabWidget để tạo một widget dạng tab

Cách dùng lớp PyQt QTabWidget để tạo một widget dạng tab

Cách dùng PyQt QWidget để làm container chứa các widget khác.

Cách dùng PyQt QWidget để làm container chứa các widget khác.

Cách sử dụng lớp PyQt QSlider để tạo một widget thanh trượt (slider).

Cách sử dụng lớp PyQt QSlider để tạo một widget thanh trượt (slider).

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

Top