CodeGym /행동 /Python SELF KO /인기 있는 asyncio 메소드

인기 있는 asyncio 메소드

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

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는 단순히 작업이 끝나기를 기다리는 것이 아니라, 모든 코루틴의 결과를 모아 각 작업의 결과가 중요한 경우에 유용합니다.

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