Lớp Task

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

7.1 Tạo nhiệm vụ

Lớp Task trong module asyncio được sử dụng để quản lý việc thực thi coroutines. Nhiệm vụ (Tasks) là các gói bọc cho coroutines, cho phép quản lý việc thực thi của chúng và theo dõi trạng thái của chúng. Lớp Task cho phép khởi chạy coroutines song song, quản lý chúng thông qua vòng lặp sự kiện.

Các phương thức chính của lớp Task

Lớp Task là một lớp bọc cho coroutine, cung cấp những khả năng bổ sung sau:

Quản lý thực thi coroutines:

Nhiệm vụ giúp dễ dàng quản lý việc thực thi coroutines, kiểm soát trạng thái của chúng và nhận kết quả.

Hủy nhiệm vụ:

Khả năng hủy nhiệm vụ làm cho Task hữu ích trong việc quản lý các hoạt động dài hạn, có thể yêu cầu dừng lại trước khi hoàn thành.

Callbacks:

Nhiệm vụ hỗ trợ thêm các callbacks, cho phép thực hiện các hành động bổ sung khi nhiệm vụ hoàn thành.

Tạo nhiệm vụ:

Nhiệm vụ được tạo ra bằng cách sử dụng hàm asyncio.create_task(coroutine) hoặc phương thức loop.create_task(coroutine), lên kế hoạch cho việc thực hiện coroutine.


import asyncio

async def say_hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World")
            
async def main():
    task = asyncio.create_task(say_hello())
    await task
            
asyncio.run(main())

7.2 Các phương thức chính

Phương thức Task.cancel():

Yêu cầu hủy nhiệm vụ. Nếu nhiệm vụ chưa hoàn thành, nó sẽ được hoàn thành với việc gọi ngoại lệ CancelledError.

Hãy viết một chương trình nhỏ để chúng ta có thể minh họa điều này.

  1. Tạo một nhiệm vụ bất đồng bộ, sẽ chỉ đợi 10 giây
  2. Bọc nó trong một đối tượng Task
  3. Chờ một giây để nhiệm vụ (Task) bắt đầu thực thi
  4. Hủy nhiệm vụ – task.cancel()
  5. Nếu tiếp tục cố gắng chờ nhiệm vụ (Task) kết thúc với sự trợ giúp của toán tử await, chúng ta sẽ nhận được ngoại lệ CancelledError.

import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(10)) 
    await asyncio.sleep(1)
    task.cancel()
    try:
        await task
    except asyncio.CancelledError:
        print("Task was cancelled")
            
asyncio.run(main())

Phương thức Task.result():

Trả về kết quả thực thi của nhiệm vụ. Nếu nhiệm vụ hoàn thành với ngoại lệ, nó sẽ được gọi khi gọi result().


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1, result='Completed'))
    result = await task
    print(result)  # Output: Completed
            
asyncio.run(main())

Trong trường hợp của chúng ta, thậm chí không cần phải viết thêm code — toán tử await biết cách làm việc với đối tượng Task: sau khi nhiệm vụ hoàn thành nó sẽ tự động gọi phương thức result() và trả về kết quả nhận được.

Phương thức Task.exception():

Trả về ngoại lệ được gây ra bởi nhiệm vụ. Nếu nhiệm vụ hoàn thành mà không có ngoại lệ, trả về None.


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    try:
        result = await task
    except Exception as e:
        print(f"Task failed with exception: {e}")

asyncio.run(main())

Không cần phải viết thêm code — nếu trong nhiệm vụ xuất hiện ngoại lệ, phương thức exception() sẽ được gọi bởi toán tử await.

Phương thức Task.add_done_callback(callback):

Thêm một callback (callback), sẽ được gọi khi nhiệm vụ hoàn thành.


import asyncio

def callback(future):
    print("Task completed")
            
async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    task.add_done_callback(callback)
    await task
            
asyncio.run(main())

Có thể thêm một hàm vào nhiệm vụ, sẽ được tự động gọi khi nhiệm vụ hoàn thành. Cách tiếp cận này cho phép làm cho code rất linh hoạt. Hơn nữa, có thể thêm nhiều hàm, và thêm chúng vào bất kỳ nhiệm vụ nào.

Phương thức Task.done():

Trả về True, nếu nhiệm vụ đã hoàn thành (thành công, có lỗi hoặc bị hủy).


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    await asyncio.sleep(1.5)
    print(task.done())  # Output: True
            
asyncio.run(main())

Với phương thức done() có thể biết được nhiệm vụ đã hoàn thành thành công chưa. Hay đúng hơn, nó đã hoàn thành hay bị hủy, bởi vì nếu có ngoại lệ xảy ra, về mặt hình thức nhiệm vụ có thể chưa hoàn thành, nhưng nó cũng không bị hủy. Nói chung, nếu nhiệm vụ bị hủy (cancel), phương thức sẽ trả về False, nếu không sẽ trả về True.

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