CodeGym /행동 /Python SELF KO /Task 클래스

Task 클래스

Python SELF KO
레벨 26 , 레슨 0
사용 가능

7.1 작업 생성하기

asyncio 모듈에서 Task 클래스는 코루틴 실행을 관리하는 데 사용돼. (Tasks)는 코루틴 래퍼로 코루틴의 실행을 제어하고 상태를 추적할 수 있게 해줘. Task 클래스는 코루틴을 병렬로 실행할 수 있게 하고, 이벤트 루프를 통해 제어할 수 있게 해줘.

Task 클래스의 주요 메서드

Task 클래스는 코루틴 위에 추가 기능을 제공하는 어떤 래퍼야. 이런 추가 기능이 있어:

코루틴 실행 관리:

작업은 코루틴 실행을 쉽게 관리하고, 상태를 제어하며 결과를 얻을 수 있게 해줘.

작업 취소:

작업을 취소할 수 있는 기능은 Task가 긴 작업을 관리하는 데 유용하게 해줘, 완료 전에 멈춰야 할 수도 있을 때.

콜백:

작업은 콜백 추가를 지원해, 작업이 완료됐을 때 추가 작업을 수행할 수 있게 해줘.

작업 생성하기:

작업은 asyncio.create_task(coroutine) 함수나 loop.create_task(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 주요 메서드

메서드 Task.cancel():

작업을 취소하도록 요청해. 작업이 아직 완료되지 않았다면 CancelledError 예외를 발생시키며 종료돼.

이를 보여줄 작은 프로그램을 작성해 보자.

  1. 10초 동안 대기하는 비동기 작업을 생성해보자
  2. 이를 Task 객체 안에 래핑해
  3. 작업이 시작되도록 1초를 기다려보자
  4. 작업을 취소해 – task.cancel()
  5. 이후 작업을 await 연산자로 기다리려고 하면 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())

메서드 Task.result():

작업의 실행 결과를 반환해. 작업이 예외와 함께 종료되면 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())

우리의 경우, 추가 코드를 작성할 필요는 없어 — await 연산자가 Task 객체와 어떻게 작동하는지 이해하니까. 작업이 완료되면 result() 메서드를 호출하고 결과를 반환해.

메서드 Task.exception():

작업으로 인해 발생한 예외를 반환해. 작업이 예외 없이 완료된 경우 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())

또한 추가 코드를 작성할 필요는 없어 — 작업에서 예외가 발생하면 await 연산자가 exception() 메서드를 호출할 거야.

메서드 Task.add_done_callback(callback):

작업이 완료될 때 호출될 콜백 (callback)을 추가해.


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())

작업이 완료됐을 때 자동으로 호출될 함수를 작업에 추가할 수 있어. 이런 접근 방식은 코드를 매우 유연하게 만들어줘. 게다가 여러 함수를 추가할 수도 있고, 어떤 작업에도 추가할 수 있어.

메서드 Task.done():

작업이 완료됐으면 True를 반환해 (성공적으로, 오류로, 또는 취소됐을 때).


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())

done() 메서드를 사용하면 작업이 성공적으로 완료됐는지 확인할 수 있어. 더 정확히 말하면, 발생한 예외 때문에 완료되지 않았을 수도 있지만, 취소되지 않았다면 작업은 완료된 거야. 만약 작업이 (cancel)로 취소됐다면 메서드는 False를 반환하고, 그렇지 않으면 True를 반환해.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION