CodeGym /행동 /Python SELF KO /Task와 Event Loop 소개

Task와 Event Loop 소개

Python SELF KO
레벨 25 , 레슨 4
사용 가능

5.1 Event Loop

이제 비동기 프로그래밍의 두 번째 부분인 (Event Loop), (Task)Future에 대해 간단히 이야기해 보자.

Event Loop를 오케스트라의 지휘자, Task를 음악가, Future를 음악가들이 연주해야 할 악보라고 생각해봐. 지휘자 (Event Loop)는 음악가들 (Task)의 연주 (비동기 작업)를 조율하는 역할을 하고, 악보 (Future)를 보면서 연주하게 해줘.

Event Loop는 Python에서 비동기 프로그래밍의 중심이야. 비동기 작업을 실행하고, 이벤트를 관리하고 입출력을 처리하는 책임이 있어. Event Loop는 지속적으로 새로운 이벤트나 작업의 존재 여부를 확인하고, 준비가 되면 실행시켜.

주요 기능

  • run_forever(): Event Loop를 시작하고 stop()을 호출할 때까지 계속 실행해.
  • run_until_complete(future): Event Loop를 시작하고 지정된 Future 객체나 코루틴이 완료되면 종료해.
  • stop(): Event Loop를 멈춰.
  • create_task(coroutine): 코루틴을 Task로 계획하고 실행해.

사용 예시:


import asyncio

async def hello():
    print("Hello, world!")
    await asyncio.sleep(1)
    print("Hello again!")
            
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())
loop.close()

이 예시에서는 먼저 get_event_loop() 메서드를 사용하여 asyncio 라이브러리의 현재 EventLoop 객체를 가져와.

그런 다음 이 EventLoop에 코루틴 hello를 추가하고 run_until_complete() 메서드를 사용하여 실행하도록 지시해.

마지막 단계에서는 close() 메서드를 사용하여 EventLoop를 닫아.

이 코드를 실행하면 먼저 "Hello, world!"가 출력되고, 1초를 대기한 후 "Hello again!"이 출력될 거야. 이는 Event Loop가 비동기 함수의 실행을 어떻게 관리하는지를 보여줘.

이 작업에 대해 더 자세히는 다음 강의에서 살펴볼 거야.

5.2 Tasks

(Tasks)는 코루틴의 실행을 관리하고 상태를 추적할 수 있게 해주는 래퍼 역할을 해. 작업을 Event Loop를 통해 병렬로 실행할 수 있게 해줘.

작업 생성 및 관리

  • asyncio.create_task(coroutine): 코루틴 실행을 위한 Task를 생성해.
  • Task.result(): 완료된 작업의 결과를 반환하거나 작업이 오류로 종료된 경우 예외를 일으켜.
  • Task.cancel(): 작업을 취소해.

사용 예시:


import asyncio

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

이 예시에서는 코루틴 say_hello()Task 객체로 감싸. 이 또한 비동기 객체이므로 결과를 받기 위해 await 연산자를 사용해야 해.

이 코드를 실행하면 1초 후에 "Hello"가 출력될 거야. 이는 Task가 코루틴의 실행을 어떻게 관리하며, 어떻게 await로 완료를 기다릴 수 있는지를 보여줘.

Task 작업에 대한 더 자세한 내용은 다음 강의에서 다룰 거야.

5.3 Futures

Future 객체는 앞으로 사용할 비동기 연산의 결과를 나타내. 비동기 작업의 상태를 관리하고 결과나 예외를 설정할 수 있어.

주요 메서드:

  • set_result(result): Future 객체에 대한 결과를 설정해.
  • set_exception(exception): Future 객체에 대한 예외를 설정해.
  • result(): Future 객체의 결과를 반환하거나 작업이 오류로 끝난 경우 예외를 일으켜.
  • exception(): 설정된 예외를 반환해.

사용 예시:


import asyncio

async def set_future(fut, value):
    await asyncio.sleep(1)
    fut.set_result(value)
            
async def main():
    loop = asyncio.get_running_loop()
    fut = loop.create_future()
    await set_future(fut, 'Hello, future!')
    print(fut.result())
            
asyncio.run(main())

이 예시에서는 Future를 생성하고, 1초 후 값을 설정한 다음 결과를 출력해. 1초 후 'Hello, future!'가 출력될 거야. 이는 Future가 앞으로 사용할 결과를 어떻게 나타내는지를 보여줘.

Task 객체와는 달리, Future 객체는 특정 Event Loop에 연결되어 있으며, 실행 중인 비동기 함수가 그 결과를 기록할 수 있어. 하지만 일반적으로 이 방식으로 많이 사용되진 않아.

대부분 Future 객체는 Task와 함께 사용되어, 더 고수준의 비동기 작업 관리를 제공해.

이제 Event Loop, TaskFuture에 대해 조금 알았으니, 다음 강의에서는 이에 대해 더 자세히 살펴볼 거야.

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