Lớp Future

Python SELF VI
Mức độ , Bài học
Có sẵn

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ộ.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION