Prefect 태스크(Task)

Prefect 태스크(Task)

태스크(task)는 Prefect에서 재사용 가능한 작업 단위예요. @task 데코레이터를 붙인 함수는 플로 안에서 호출될 때 태스크 런으로 실행되고, 개별 실행 상태·재시도·관측성을 갖게 돼요. 워크플로를 태스크로 잘게 나누면 어느 단계가 실패했는지, 얼마나 걸렸는지를 세밀하게 추적할 수 있어요.

출처: Prefect Tasks

태스크 정의

태스크도 플로와 비슷하게 함수에 @task 데코레이터를 붙여 정의해요. 이름과 설명을 지정할 수도 있어요.

from prefect import task

@task(name="hello-task", description="This task says hello.")
def my_task():
    print("Hello, I'm a task")

name을 생략하면 함수 이름이 자동으로 쓰이고, description을 생략하면 docstring을 가져와요.

태스크 런 이름 붙이기

task_run_name 인자를 쓰면 태스크 런마다 구분되는 이름을 만들 수 있어요. 파이썬 문자열 포매팅 문법을 그대로 쓸 수 있어요.

@task(name="My Example Task",
      description="An example task for a tutorial.",
      task_run_name="hello-{name}-on-{date:%A}")
def my_task(name, date):
    pass

이렇게 하면 실행할 때마다 hello-marvin-on-Thursday 같은 이름의 태스크 런이 만들어져서, UI에서 개별 실행을 알아보기 쉬워져요.

태스크 타임아웃

플로와 마찬가지로 태스크에도 타임아웃을 지정할 수 있어요. 다만 실행 방식에 따라 동작이 조금 달라요. 비동기(async) 태스크의 타임아웃은 await 지점에서 협조적 취소(cooperative cancellation)로 동작해서, 타임아웃에 도달하면 다음 await에서 태스크가 취소돼요. 비동기 코드에서 특히 안정적인 타임아웃 동작을 제공해요.

태스크를 쓰는 이유

태스크 단위로 나누면 이런 장점이 생겨요.

  • 개별 작업의 상태·소요 시간·재시도 이력 추적
  • 재시도·캐싱 같은 실행 정책을 작업 단위로 적용
  • 실패 지점을 정확히 파악해 디버깅

더 알아보기