8.1 Đặc điểm chính của lớp Future
Lớp Future
trong module asyncio
đại diện cho kết quả của một
thao tác bất đồng bộ, sẽ có sẵn trong tương lai.
Các đối tượng Future
được sử dụng để quản lý trạng thái và kết quả của
các nhiệm vụ bất đồng bộ.
Đặc điểm chính của lớp Future
Đối tượng Future
là một container cho kết quả, sẽ có sẵn sau khi nhiệm vụ
kết thúc. Nó cung cấp giao diện để lấy kết quả hoặc exception, sẽ được
thiết lập sau khi hoàn thành thao tác bất đồng bộ.
Tạo và quản lý đối tượng Future
-
Tạo: Thường được tạo bằng cách sử dụng
loop.create_future()
. -
Thiết lập kết quả: Kết quả được thiết lập
bằng phương thức
set_result(result)
. -
Thiết lập exception: Exception
được thiết lập bằng phương thức
set_exception(exception)
.
Phương thức và thuộc tính chính
set_result(result):
Thiết lập kết quả cho đối tượng Future
. Tất cả các coroutine đang chờ
đối tượng này sẽ ngay lập tức tiếp tục với kết quả này.
set_exception(exception):
Thiết lập exception cho đối tượng Future
. Tất cả các coroutine đang chờ
đối tượng này sẽ ngay lập tức tiếp tục với exception này.
result():
Trả về kết quả của đối tượng Future
, nếu nó có sẵn. Nếu thao tác kết thúc
với một exception, sẽ gọi exception này.
exception():
Trả về exception, nếu nó đã được thiết lập, hoặc None
, nếu
đối tượng Future
chưa hoàn thành hoặc hoàn thành thành công.
done():
Trả về True
, nếu đối tượng Future
đã hoàn thành (với kết quả hoặc
exception).
add_done_callback(callback):
Thêm một callback sẽ được gọi khi đối tượng Future
hoàn thành.
8.2 Ví dụ sử dụng
Thiết lập và lấy kết quả
import asyncio
async def set_future_result(fut, delay):
await asyncio.sleep(delay)
fut.set_result("Kết quả Future đã sẵn sàng")
async def main():
loop = asyncio.get_running_loop()
fut = loop.create_future()
asyncio.create_task(set_future_result(fut, 2))
result = await fut
print(result)
asyncio.run(main())
Xử lý exception
import asyncio
async def set_future_exception(fut, delay):
await asyncio.sleep(delay)
fut.set_exception(ValueError("Xảy ra lỗi"))
async def main():
loop = asyncio.get_running_loop()
fut = loop.create_future()
asyncio.create_task(set_future_exception(fut, 2))
try:
result = await fut
except ValueError as e:
print(f"Bắt được exception: {e}")
asyncio.run(main())
Tương tác với nhiệm vụ
Thường thì các đối tượng Future
được sử dụng kết hợp với các nhiệm vụ (Tasks)
. Khi
một nhiệm vụ được tạo bằng asyncio.create_task()
, nó tự động tạo một đối tượng Future
,
mà có thể được sử dụng để theo dõi và quản lý trạng thái của nhiệm vụ.
import asyncio
async def example_coroutine():
await asyncio.sleep(1)
return "Kết quả nhiệm vụ"
async def main():
task = asyncio.create_task(example_coroutine())
print(await task)
asyncio.run(main())
8.3 Ưu điểm và đặc điểm
Các đối tượng Future
cho phép quản lý kết quả và exception
của các thao tác bất đồng bộ, mang lại sự linh hoạt và kiểm soát quá trình
thực thi. Future
có thể được sử dụng trong nhiều kịch bản
lập trình bất đồng bộ, bao gồm các nhiệm vụ, bộ đếm thời gian, callback
và nhiều hơn nữa.
Thường thì các đối tượng Future
được sử dụng kết hợp với các nhiệm vụ (Tasks)
. Cách tiếp cận này cho phép có mức độ kiểm soát cao hơn đối với quá trình thực thi và trạng thái của các thao tác bất đồng bộ.
Hạn chế
Trong một số trường hợp, việc sử dụng Future
có thể phức tạp hơn
so với việc sử dụng các trừu tượng cấp cao hơn, như nhiệm vụ (Tasks)
hoặc coroutine. Khi sử dụng Future
có thể
đòi hỏi nhiều quản lý thủ công hơn đối với trạng thái và kết quả
của các thao tác bất đồng bộ.
GO TO FULL VERSION