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 예외를 발생시키며 종료돼.
이를 보여줄 작은 프로그램을 작성해 보자.
10초 동안 대기하는 비동기 작업을 생성해보자이를Task객체 안에 래핑해작업이 시작되도록 1초를 기다려보자작업을 취소해 –task.cancel()-
이후 작업을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를 반환해.
GO TO FULL VERSION