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
, Task
및 Future
에 대해 조금 알았으니, 다음 강의에서는 이에 대해 더 자세히 살펴볼 거야.
GO TO FULL VERSION