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.
Tạo một nhiệm vụ bất đồng bộ, sẽ chỉ đợi 10 giâyBọc nó trong một đối tượngTaskChờ một giây để nhiệm vụ (Task) bắt đầu thực thiHủy nhiệm vụ –task.cancel()-
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.
GO TO FULL VERSION