스택큐힙리스트

"asyncio.sleep() vs time.sleep()" 번역: asyncio.sleep() 대비 time.sleep() 본문

카테고리 없음

"asyncio.sleep() vs time.sleep()" 번역: asyncio.sleep() 대비 time.sleep()

스택큐힙리스트 2023. 11. 14. 14:50
반응형

asyncio 페이지에 접속하면 첫 번째 예제는 hello world 프로그램입니다. python 3.73에서 실행하면 일반적인 예제와 차이가 없습니다. 차이점과 실제적인 예제를 알려주실 분은 있나요?


In [1]: import asyncio
...:
...: async def main():
...: print('Hello ...')
...: await asyncio.sleep(5)
...: print('... World!')
...:
...: # Python 3.7+
...: asyncio.run(main())
Hello ...
... World!
In [2]:
In [2]: import time
...:
...: def main():
...: print('Hello ...')
...: time.sleep(5)
...: print('... World!')
...:
...: # Python 3.7+
...: main()
Hello ...
... World!

의도적으로 시간을 1초에서 5초로 증가시켰지만 특별한 것은 보이지 않았습니다.

답변 1

특별한 것은 볼 수 없습니다. 코드에는 비동기 작업이 많지 않기 때문입니다. 그러나 주요한 차이점은 time.sleep(5)는 블로킹이고 asyncio.sleep(5)는 논블로킹입니다.


time.sleep(5)가 호출되면 스크립트의 전체 실행이 차단되어 대기 상태로 들어갑니다. 그러나 await asyncio.sleep(5)를 호출하면 이벤트 루프에 다른 작업을 실행하도록 요청하면서 await 문이 실행을 완료하게 됩니다.


다음은 개선된 예제입니다.


import asyncio
async def hello():
print('안녕하세요 ...')
await asyncio.sleep(1)
print('... 세계!')
async def main():
await asyncio.gather(hello(), hello())
asyncio.run(main())

출력 결과는 다음과 같습니다.


~$ python3.7 async.py
안녕하세요 ...
안녕하세요 ...
... 세계!
... 세계!

여기서 await asyncio.sleep(1)이 스크립트의 실행을 차단하지 않음을 알 수 있습니다.


반면에, 라인 await asyncio.sleep(1)time.sleep(1)으로 대체하면 출력은 다음과 같이 됩니다.


Hello ...
... World!
Hello ...
... World!

왜냐하면 time.sleep은 차단(blocking)되기 때문에 첫 번째 hello() 호출이 끝나야 두 번째 hello() 호출이 실행될 수 있기 때문입니다.

답변 2

asyncio.sleep() vs time.sleep(): 비동기 대기 시간 관리의 중요성
비동기 프로그래밍은 현대 소프트웨어 개발에서 중요한 역할을 하며, 파이썬의 asyncio 모듈은 비동기 작업에 효과적인 기능을 제공합니다. 이 모듈에서 주목할 만한 기능 중 하나는 asyncio.sleep()입니다. 일반적인 time.sleep()과 비교하여 asyncio.sleep()의 장점과 사용 시 주의할 점에 대해 알아보고자 합니다.
비동기 프로그래밍에서 시간 대기는 매우 중요한 요소입니다. 애플리케이션은 특정 작업이 완료될 때까지 대기하거나 다른 작업을 수행한 후 되돌아와야 할 때가 많기 때문입니다. 여기서 asyncio.sleep()가 유용한 역할을 합니다. 이 함수는 현재 작업을 멈추고 지정된 시간 동안 대기하는 기능을 제공합니다.
첫 번째로, asyncio.sleep()은 비동기 프로그램의 성능을 향상시켜줍니다. 전통적인 time.sleep()은 현재 작업을 일시 중지시키고 대기하는 동안 다른 작업도 중단시키기 때문에 성능 저하를 유발할 수 있습니다. 이에 비해 asyncio.sleep()은 비동기 작업 큐에 작업들을 스케줄링하므로, 다른 작업들은 계속해서 실행될 수 있습니다. 따라서 애플리케이션의 응답성과 처리량을 향상시킵니다.
두 번째로, asyncio.sleep()는 스케줄링과 조합이 가능합니다. asyncio 모듈은 이벤트 루프를 통해 다양한 비동기 작업들이 제어됩니다. asyncio.sleep()을 사용하면 특정 이벤트가 발생하거나 다른 비동기 작업이 완료될 때까지 대기하는 동안, 이벤트 루프는 다른 작업들을 실행할 수 있습니다. 이를 통해 여러 작업들을 효율적으로 조합하여 복잡한 비동기 흐름을 구현할 수 있습니다.
그러나 asyncio.sleep()을 사용할 때 주의해야 할 점도 있습니다. 비동기 작업을 위해 asyncio.sleep()을 사용하면서도 너무 짧게 설정하면 응답성이 떨어질 수 있습니다. 이 함수는 대기 시간으로 설정한 시간 이후 동일한 이벤트 루프에서 실행되는 다음 작업에게 양보하는 원리로 동작합니다. 즉, 아주 짧은 대기 시간을 설정하면 다음 작업이 실행될 기회를 제대로 얻지 못할 가능성이 있습니다. 적절한 대기 시간을 설정하여 비동기 흐름을 최적화하는 것이 중요합니다.
앞서 언급한 내용들을 종합해보면, asyncio.sleep()은 비동기 프로그래밍에서 시간 대기를 효율적으로 관리할 수 있는 유용한 기능입니다. 기존의 time.sleep()과 비교하여 성능 향상과 스케줄링, 조합 가능성 등 다양한 장점을 제공합니다. 그러나 적절한 대기 시간 설정에 주의해야 하며, 비동기 프로그래밍의 성능을 극대화하기 위해 적절히 활용하는 것이 좋습니다.
요약하자면, asyncio.sleep()은 비동기 프로그래밍에서 시간 대기를 효율적으로 관리하기 위한 필수적인 도구입니다. 이 함수의 활용은 애플리케이션의 성능과 응답성을 향상시키는 데 큰 도움이 될 것입니다.

반응형
Comments