HOWTO · Python
파이썬에서 5초 기다리는 방법
이 튜토리얼에서는 Python에서 약 5초 동안 기다리는 방법을 설명합니다.
이 페이지의 내용
일반적인 동기식 Python 코드에서 현재 스레드를 약 5초 동안 멈추려면 time.sleep(5)를 호출합니다. 다른 스레드가 더 일찍 깨울 수 있어야 한다면 threading.Event를, 지연 후 콜백을 실행하려면 threading.Timer를 사용하세요. 코루틴 안에서는 asyncio.sleep()을 사용하고, 예약된 이벤트를 처리해야 한다면 sched를 고려할 수 있습니다.
Python에서 time.sleep() 함수로 5초 기다리기
time.sleep() 함수는 초 단위의 대기 시간을 받아 현재 호출 스레드를 멈춥니다. 0.5처럼 소수 단위의 시간도 지정할 수 있습니다. 다만 5초는 요청한 최소 대기 시간일 뿐, 정확히 그 시점에 깨어난다는 보장은 없습니다. 운영 체제의 스케줄링에 따라 실제 대기 시간은 더 길어질 수 있습니다.
다음 독립 실행형 예제는 대기 전후에 메시지를 출력합니다.
import time
print("Waiting")
time.sleep(5)
print("Finished")
Waiting
Finished
간단한 동기식 스크립트라면 이 방법을 사용하세요. 스레드가 잠들어 있는 동안에는 다른 작업을 할 수 없습니다. 일반적인 키보드 인터럽트인 Ctrl+C로 대기를 중단할 수 있으며, 이 작업에 사용자 정의 시그널 처리를 추가할 필요는 대개 없습니다.
threading 라이브러리의 Event 클래스로 Python에서 5초 기다리기
threading.Event는 스레드 간 조정에 사용하는 기본 요소입니다. wait(5)를 호출하면 현재 스레드는 최대 5초 동안 대기하고, 그 전에 다른 스레드가 이벤트를 설정하면 더 일찍 반환합니다. 따라서 작업 스레드가 신호 또는 시간 초과 중 하나를 기다려야 할 때 유용합니다.
import threading
ready = threading.Event()
print("Waiting")
ready.wait(5)
print("Finished")
Waiting
Finished
이 예제에서는 다른 스레드가 ready를 설정하지 않으므로 시간 초과까지 기다립니다. 여러 스레드가 함께 동작하는 프로그램에서는 다른 스레드가 ready.set()을 호출해 대기 중인 스레드를 깨울 수 있습니다. 다음 동작이 시간 초과 전에 이벤트가 설정되었는지에 따라 달라진다면 wait()의 반환값을 확인하세요.
threading 라이브러리의 Timer() 클래스로 Python에서 5초 기다리기
threading.Timer는 별도의 스레드를 시작해 지연 시간 후 콜백을 호출하는 클래스입니다. 타이머를 시작한 스레드를 멈추지는 않습니다. 짧은 스크립트에서 콜백이 끝날 때까지 기다리려면 join()으로 타이머 스레드의 종료를 기다리세요. 콜백이 시작되기 전에 더는 필요하지 않게 되면 cancel()을 호출할 수 있습니다.
from threading import Timer
def report():
print("Callback ran")
print("Timer started")
timer = Timer(5, report)
timer.start()
timer.join()
print("Main thread finished")
Timer started
Callback ran
Main thread finished
콜백은 타이머 스레드에서 실행되고, join()을 호출한 메인 스레드는 해당 스레드가 끝날 때까지 기다립니다. 타이머 하나는 콜백 하나를 예약합니다. 반복 작업이나 여러 이벤트를 예약하려면 반복문이나 스케줄러를 사용하세요.
비동기 코드에서 asyncio.sleep()으로 Python에서 5초 기다리기
비동기 코드 안에서 await asyncio.sleep(5)를 호출하면 현재 코루틴은 대기하면서 이벤트 루프가 다른 작업을 실행할 수 있도록 제어권을 넘깁니다. time.sleep(5)처럼 이벤트 루프 스레드를 막지는 않습니다.
import asyncio
async def main():
print("Waiting")
await asyncio.sleep(5)
print("Finished")
asyncio.run(main())
Waiting
Finished
독립 실행형 스크립트에서는 asyncio.run(main())으로 실행하세요. 이미 실행 중인 이벤트 루프가 있는 애플리케이션에서는 asyncio.run()을 다시 시작하지 말고 해당 루프 안에서 코루틴을 호출하거나 예약해야 합니다.
sched 모듈로 Python에서 5초 기다리기
sched 모듈은 범용 이벤트 스케줄러를 제공합니다. 지연 시간, 우선순위, 콜백 및 선택적 인수를 지정해 이벤트를 추가한 다음 run()을 호출하면 대기열에 있는 이벤트를 처리합니다. 다음 이벤트 실행 시점이 아직 오지 않았다면 run()은 그 시점까지 기다립니다. 예약된 이벤트를 관리할 때 유용하지만, 한 번만 대기하는 작업에는 더 많은 설정이 필요합니다.
import sched
import time
def report():
print("Scheduled event ran")
scheduler = sched.scheduler(time.monotonic, time.sleep)
print("Scheduler started")
scheduler.enter(5, 1, report)
scheduler.run()
print("Scheduler finished")
Scheduler started
Scheduled event ran
Scheduler finished
스케줄러는 단조 시계를 사용하므로 경과 시간 기준의 예약은 시스템 시각 조정의 영향을 받지 않습니다. 지연 함수로 time.sleep을 사용하며, 대기열에 등록된 이벤트가 실행될 때까지 run()은 반환하지 않습니다.
결론
간단한 동기식 대기에는 time.sleep(5)를 선택하세요. 다른 스레드가 대기 중인 스레드에 신호를 보낼 수 있다면 threading.Event.wait(5)를, 지연 후 콜백 하나를 실행하려면 threading.Timer를 사용하세요. 코루틴에서 다른 작업이 진행되도록 하려면 asyncio.sleep(5)를 사용하고, 하나 이상의 시간 지정 이벤트를 관리하려면 sched를 선택하세요. 운영 체제와 이벤트 루프가 대기 중인 코드를 다시 실행할 시점을 결정하므로 각 대기 시간은 근사치입니다.