4.1 메소드 run()
asyncio
모듈은 비동기 프로그램을 생성하고 관리하는 데 필요한 많은 메소드와 함수를 제공합니다. asyncio
모듈의 가장 인기있고 자주 사용되는 메소드와 함수 중 일부는 다음과 같습니다.
오늘은 4가지 가장 흔한 메소드를 살펴볼 거예요:
run()
sleep()
wait()
gather()
자세히 알아봅시다:
메소드 asyncio.run(coroutine)
이 메소드는 비동기 프로그램을 실행하는 데 사용됩니다. 특히, 프로그램의 메인 스레드와 같은 동기 컨텍스트에서 비동기 코드를 실행하고 싶을 때 유용합니다.
메소드 asyncio.run()
은 주 코루틴을 실행하고 이벤트 루프의 생성과 종료를 관리합니다. 이 메소드는 자동으로 새로운 이벤트 루프를 생성하고 코루틴이 완료되면 이를 종료합니다.
시그니처:
asyncio.run(async_function(), *, debug=False)
-
async_function
: 실행해야 하는 코루틴. -
debug
: 이벤트 루프에 대한 디버그 모드를 활성화하는 선택적 매개변수.
사용 예:
import asyncio
async def main():
print('Hello')
await asyncio.sleep(1)
print('World')
asyncio.run(main())
제한 사항
다른 이벤트 루프 내부에서 호출할 수 없습니다:
asyncio.run()
은 자체 이벤트 루프를 생성하고 종료하기 때문에 동기 코드에서만 호출되어야 합니다. 이미 존재하는 이벤트 루프 내에서 이를 호출하려고 하면 오류가 발생합니다.
최상위 레벨에만 적합:
이 메소드는 프로그램의 주 진입점을 실행하는 데 적합하며, 다른 비동기 함수의 중첩 호출에 사용되어서는 안 됩니다.
4.2 메소드 sleep()
이 메소드는 특정 시간 동안 코루틴의 실행을 일시 중지해야 하지만, 다른 코루틴의 실행은 차단하지 않으려 할 때 사용됩니다.
메소드 asyncio.sleep()
는 asyncio
모듈에서 현재 코루틴의 실행을 제공된 초만큼 일시 중지하는 데 사용됩니다.
이 메소드는 유사한 time.sleep()
메소드와 다르게 일시 중지 동안 다른 작업이 실행될 수 있게 합니다. 이는 주 스레드를 차단하지 않고 지연이나 대기를 요구하는 비동기 프로그램을 작성하는 데 유용합니다.
시그니처:
asyncio.sleep(delay, result=None)
-
delay
: 대기 시간(초 단위, 실수 가능). -
result
: 대기 종료 후 반환될 선택적 결과.
적용 예:
import asyncio
async def main():
print('Start sleeping')
await asyncio.sleep(2)
print('Wake up')
asyncio.run(main())
이 예제에서 코루틴 main
은 2초 동안 일시 중지되어 다른 작업이 이 시간 동안 실행될 수 있게 하고, 그 후에 계속되어 "Wake up"을 출력합니다.
4.3 메소드 wait()
이 메소드는 여러 비동기 작업이 완료되기를 기다려야 하지만, 기다리는 과정에서 더 세밀한 제어가 필요할 때 유용합니다.
메소드 asyncio.wait()
는 asyncio
모듈에서 여러 비동기 작업이나 코루틴이 완료되기를 기다리게 해줍니다. 모든 작업이 완료될 때까지, 첫 번째 작업이 완료될 때까지, 또는 오류가 발생한 작업이 있을 때까지 기다릴 수 있습니다.
gather()
와 달리, wait()
메소드는 대기 과정을 더 통제할 수 있게 하며, timeout과 완료 조건을 지정할 수 있게 합니다.
asyncio.wait()
메소드의 주요 특징
시그니처:
asyncio.wait(fs, *, timeout=None, return_when=ALL_COMPLETED)
어디에:
-
fs
: 기다려야 할Future
객체 또는 코루틴의 컬렉션. -
timeout
: 최대 대기 시간을 초 단위로 나타내는 선택적 매개변수. 대기 시간이 초과되면 메소드는 이 시점까지 완료된 작업을 반환합니다. -
return_when
: 메소드가 완료되어야 하는 조건을 정의하는 옵션. 가능한 값:-
ALL_COMPLETED
: 모든 작업이 완료될 때 결과 반환(기본 값). -
FIRST_COMPLETED
: 첫 번째 작업이 완료될 때 결과 반환. -
FIRST_EXCEPTION
: 어떤 작업이라도 예외로 완료될 때 결과 반환.
-
여러 작업이나 코루틴의 완료를 기다립니다. 대기 시간과 완료 조건을 지정할 수 있습니다.
import asyncio
async def say(what, delay):
await asyncio.sleep(delay)
return what
async def main():
task1 = asyncio.create_task(say('hello', 1))
task2 = asyncio.create_task(say('world', 2))
done, pending = await asyncio.wait([task1, task2], timeout=1.5)
for task in done:
print(task.result())
asyncio.run(main())
위의 예에서 우리는 각 코루틴 say()
를 Task
객체로 래핑하는 create_task()
호출을 사용하여 각각을 Task
객체로 만들고, 그런 다음 이 태스크들의 리스트를 wait()
메소드에 전달합니다. Task
객체는 하나가 완료되기 전에 다른 코루틴을 병렬로 실행할 수 있게 해줍니다.
wait
메소드는 작업을 1.5초 동안만 기다리고, 그 후에 완료된 작업 (done)
과 아직 진행 중인 작업 (pending)
의 튜플을 반환합니다.
4.4 메소드 gather()
이 메소드는 여러 비동기 작업을 병렬로 실행하고 결과를 리스트 형태로 받아야 할 때 특히 유용합니다.
메소드 asyncio.gather()
는 asyncio
모듈에서 여러 비동기 작업을 병렬로 실행하고 그 결과들을 리스트 형태로 반환하는 데 사용됩니다. 이는 코루틴이나 작업을 그룹화하고 완료를 기다리는 편리한 방법입니다.
asyncio.gather()
메소드의 주요 특징
시그니처:
asyncio.gather(*coros_or_futures, return_exceptions=False)
어디에:
-
coros_or_futures
: 실행해야 하는 코루틴 또는Future
객체들. -
return_exceptions
: 예외를 결과로 반환해야 하는지 나타내는 불리언 값. 기본적으로False
.
사용 예
import asyncio
async def say_after(delay, what):
await asyncio.sleep(delay)
return what
async def main():
results = await asyncio.gather(
say_after(1, 'hello'),
say_after(2, 'world')
)
print(results)
asyncio.run(main())
이 예제는 asyncio.gather
를 사용해 각각의 지연 시간이 있는 여러 작업을 병렬로 실행할 수 있는 방법을 보여줍니다. 모든 작업의 결과가 리스트 형태로 반환됩니다. wait
와 달리, gather
는 단순히 작업이 끝나기를 기다리는 것이 아니라, 모든 코루틴의 결과를 모아 각 작업의 결과가 중요한 경우에 유용합니다.
GO TO FULL VERSION