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:

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