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 async
và await
để 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.
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 async
và await
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 async
và await
, 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.