콘텐츠로 건너뛰기

파이썬으로 일시 중지하는 방법은? (Python Pause Explained)

[

Python sleep(): 코드에 시간 지연 추가하는 방법

마이크 드리스콜에 의해 중급이다.

프로그램이 어떤 일을 기다리도록 하려면 어떻게 해야 할까요? 대부분의 경우, 코드가 가능한 빨리 실행되길 원할 것입니다. 그러나 때로는 코드를 잠시 멈추게 두는 것이 더 바람직할 때도 있습니다.

이 튜토리얼에서는 다음과 같은 방법으로 Python sleep() 호출을 추가하는 방법을 알아보겠습니다:

  • time.sleep()
  • Decorator
  • Thread
  • Async IO
  • 그래픽 사용자 인터페이스(GUI)

본 문서는 Python 지식을 키워나가고자 하는 중급 개발자를 대상으로 합니다. 이에 해당하는 경우 시작해 봅시다!

Adding a Python sleep() Call With time.sleep()

time.sleep()를 사용하는 예시입니다:

import time
time.sleep(3) # 3초 동안 잠들기

이 코드를 콘솔에서 실행하면 REPL에서 새로운 문장을 입력하기 전에 약간의 지연이 발생합니다.

참고: Python 3.5에서는 핵심개발자들이 time.sleep()의 동작을 약간 변경했습니다. 새로운 Python sleep() 시스템 호출은 신호에 의해 중단될 경우에도 지정한 시간만큼은 최소한 유지되게 됩니다. 그러나 신호 자체가 예외를 발생시키는 경우에는 해당하지 않습니다.

Python의 timeit 모듈을 사용하여 잠이 얼마나 지속되는지 테스트할 수 있습니다:

Terminal window
$ python3 -m timeit -n 3 "import time; time.sleep(3)"
3 loops, best of 5: 3 sec per loop

여기서 -n 매개변수를 사용하여 timeit이 뒤에 오는 문장을 실행할 횟수를 알려줍니다. timeit이 문장을 3번 실행하고 최적의 실행 시간이 3초라는 것을 확인할 수 있습니다. 이는 예상대로입니다.

timeit은 기본적으로 코드를 백만 번 실행합니다. 위의 코드를 기본 -n 옵션으로 실행하면 1회당 3초가 걸리므로 터미널은 대략 34일 동안 정지될 것입니다! timeit 모듈에는 여러 다른 명령줄 옵션들이 있으니 문서를 확인해 보세요.

이제 조금 더 현실적인 예시를 만들어 봅시다. 시스템 관리자는 웹사이트 중 하나가 다운되었을 때 알아야 합니다. 정기적으로 웹사이트의 상태 코드를 확인할 수 있으면 좋겠지만, 웹페이지 로드가 완료될 때까지 기다려야 합니다. 이런 경우에는 time.sleep()를 사용하여 상태 코드를 확인하는 스크립트를 만들 수 있습니다. 자세한 코드는 다음과 같습니다.

time.sleep()을 이용한 Python sleep() 호출 추가하기

import time
import requests
def check_website(url):
while True:
response = requests.get(url)
status_code = response.status_code
if status_code != 200:
print(f"Website is down with status code: {status_code}")
else:
print("Website is up and running!")
time.sleep(60) # 60초 동안 잠들기

이 함수는 requests 모듈을 이용해 주어진 URL로 GET 요청을 보내고 응답의 상태 코드를 확인합니다. 상태 코드가 200이 아니면 웹사이트가 다운되었다고 판단하고, 그렇지 않은 경우에는 웹사이트가 정상적으로 작동 중임을 알립니다. 그리고 60초 동안 잠들고 다시 반복합니다.

위 함수를 실행하면 웹사이트의 상태를 60초마다 확인하게 됩니다. 웹사이트가 다운된 경우에는 알려주므로 시간을 낭비할 필요가 없습니다.

Python 디코레이터를 사용하여 Python sleep() 호출 추가하기

디코레이터를 사용하면 코드 중복을 줄이고 재사용 가능한 기능을 만들 수 있습니다. 이제 Python sleep()를 사용하는 디코레이터 함수를 만들어 보겠습니다. 이 함수는 decorator 패턴을 사용하여 기존 함수의 실행 전에 지정된 시간만큼 대기하는 기능을 추가합니다.

import time
from functools import wraps
def sleep_decorator(seconds):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
time.sleep(seconds)
return func(*args, **kwargs)
return wrapper
return decorator

위 코드에서 sleep_decorator() 함수는 특정 시간(초)을 인자로 받고, 이 시간만큼 디코레이터로 감싸진 함수의 실행을 지연시킵니다. decorator() 함수는 실제로 함수에 대한 decorator를 생성하며, wrapper() 함수는 decorator가 실행되었을 때 호출되는 함수입니다.

이제 이 디코레이터 함수를 사용하여 함수를 장식할 수 있습니다. 다음 예시를 살펴봅시다.

@sleep_decorator(2)
def say_hello():
print("Hello, world!")
say_hello() # 2초 동안 잠들기

위 코드에서는 say_hello() 함수를 sleep_decorator()로 장식하고 있습니다. @ 기호와 함께 사용하여 함수의 선언 위에 디코레이터를 작성할 수 있습니다. 이렇게 하면 say_hello() 함수가 실행되기 전에 2초 동안 대기하게 됩니다.

Python sleep() 호출을 스레드로 추가하기

스레드를 사용하여 동시에 다수의 작업을 처리할 수 있습니다. threading 모듈을 이용하면 Python에서 스레드를 쉽게 사용할 수 있습니다. 실제로 스레드를 사용하여 Python sleep() 호출을 추가하는 방법에 대해 알아보겠습니다.

time.sleep()을 이용한 Python sleep() 호출 스레드 추가하기

import time
from threading import Thread
def sleep_func() -> None:
time.sleep(5)
print("Thread is awake!")
thread = Thread(target=sleep_func)
thread.start() # 스레드 시작하기
print("Main thread finished!")

위 코드는 sleep_func() 함수를 스레드로 실행하고 있습니다. time.sleep(5)를 사용하여 5초 동안 스레드를 잠들게 한 후에 “Thread is awake!”를 출력합니다. Thread 객체를 만들고 Thread 생성자에 target 매개변수로 sleep_func() 함수를 전달하여 스레드를 생성합니다. 그런 다음 start() 메서드를 호출하여 스레드를 시작합니다. start() 메서드는 스레드에서 run() 메서드를 호출하므로 sleep_func() 함수가 실행됩니다.

메인 스레드는 스레드가 시작되자마자 “Main thread finished!”를 출력하고 종료됩니다.

Python sleep() 호출을 알림 기능으로 추가하기

알림 기능을 사용하면 프로그램이 특정 이벤트를 기다리는 동안 다른 작업을 수행할 수 있습니다. Python은 이를 위해 threading 모듈에 있는 Event 객체를 제공합니다. Event.wait() 메서드를 사용하여 알림 기능을 구현할 수 있습니다.

event.wait()을 이용한 Python sleep() 호출 추가하기

import time
from threading import Event, Thread
def sleep_func() -> None:
event.wait()
print("Event occurred!")
event = Event()
print("Program is working!")
time.sleep(2) # 2초 동안 잠들기
print("Waking up the sleeping thread...")
event.set() # 알림 설정하기
thread = Thread(target=sleep_func)
thread.start() # 스레드 시작하기
print("Main thread finished!")

위 코드는 sleep_func() 함수를 스레드로 실행하는데, event.wait()을 사용하여 스레드가 event 객체의 알림을 기다리도록 합니다. 메인 스레드는 “Program is working!”을 출력한 다음 2초 동안 잠들고, “Waking up the sleeping thread…”를 출력한 다음 event.set()을 호출하여 알림을 설정합니다. 그런 다음 sleep_func() 함수가 실행됩니다.

이 코드를 실행하면 메인 스레드는 스레드가 알림을 받을 때까지 기다립니다. 메인 스레드가 대기하는 동안 다른 작업을 수행할 수 있습니다. 스레드는 event.set()이 호출되면 알림을 받고 “Event occurred!”를 출력합니다.

Python sleep() 호출과 Async IO

비동기 프로그래밍을 위해 Python의 asyncio 모듈을 사용할 수 있습니다. asyncio.sleep() 함수를 사용하여 코드 실행을 지연시킬 수 있습니다. sleep() 함수는 비동기 컨텍스트에서 사용하여 다른 작업을 수행하는 동안에도 매개변수로 지정한 시간만큼의 지연을 생성합니다.

다음은 asyncio.sleep() 함수를 사용한 예시 코드입니다:

import asyncio
async def sleep_func() -> None:
await asyncio.sleep(3) # 3초 동안 잠들기
print("Async function done sleeping")
asyncio.run(sleep_func())

여기서 asyncio.sleep() 함수는 비동기 함수 sleep_func()에서 3초 동안 대기하는 비동기 연산을 실행합니다. await 키워드를 사용하여 비동기 연산이 완료될 때까지 다른 작업을 수행할 수 있습니다.

asyncio.run() 함수를 사용하여 비동기 함수를 실행하고 있습니다.

Python sleep() 호출과 GUI

Python은 Tkinter 및 wxPython과 같은 다양한 그래픽 사용자 인터페이스(GUI) 프레임워크를 포함하고 있습니다. 이러한 프레임워크를 사용하여 애플리케이션에 시간 지연을 추가하는 방법을 알아보겠습니다.

Tkinter에서의 sleep

import tkinter as tk
def sleep_func():
window = tk.Tk()
window.title("Sleeping with Tkinter")
window.geometry("200x200")
def close_window():
window.destroy()
label = tk.Label(window, text="This window will close in 5 seconds")
label.pack()
window.after(5000, close_window)
window.mainloop()
sleep_func()

위 코드에서는 tkinter를 사용하여 Tkinter 윈도우를 생성합니다. window.after(5000, close_window) 코드를 사용하여 5초 후에 close_window() 함수를 호출하여 윈도우를 닫습니다.

window.mainloop()를 호출하여 윈도우가 종료되지 않고 대기하는 동안 사용자 인터페이스를 표시합니다.

wxPython에서의 sleep

import wx
class MyFrame(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title, size=(200, 200))
panel = wx.Panel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(sizer)
label = wx.StaticText(panel, label="This window will close in 5 seconds")
sizer.Add(label, wx.ALIGN_CENTER)
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnTimer)
self.timer.Start(5000)
def OnTimer(self, event):
self.Destroy()
def sleep_func():
app = wx.App()
frame = MyFrame(None, "Sleeping with wxPython")
frame.Show()
app.MainLoop()
sleep_func()

이 코드에서는 wxPython을 사용하여 MyFrame 클래스를 정의합니다. 이 클래스는 wx.Frame을 상속하고 있으며 wx.Timer를 사용하여 5초 후에 selfDestroy()하는 OnTimer() 메서드를 호출합니다.

또한 sleep_func() 함수에서 MyFrame 인스턴스를 생성하고, frame.Show()를 호출하여 윈도우를 표시합니다. app.MainLoop()를 호출하여 윈도우가 종료되지 않고 대기하는 동안 사용자 인터페이스를 표시합니다.

결론

이 튜토리얼에서는 Python program에 time.sleep()을 사용하여 코드에 시간 지연을 추가하는 방법에 대해 알아보았습니다. time.sleep()뿐만 아니라 디코레이터, 스레드, Async IO 및 GUI와 함께 Python sleep() 호출을 추가하는 방법에 대해서도 살펴보았습니다.

이러한 기술은 여러분의 프로그램에서 시간 지연이 필요한 경우에 유용합니다. 파일 업로드, API 호출, 데이터베이스 질의 및 그래픽 로딩과 같은 작업에서는 Python sleep() 호출을 사용하여 코드의 실행을 제어할 수 있습니다.

다양한 기술을 사용하여 Python 프로그램에 시간 지연을 추가하는 방법을 이해하고 활용하는 것은 중급 개발자로 성장하기 위한 중요한 요소입니다.

이 튜토리얼이 여러분의 Python 학습 및 개발 여정에 도움이 되기를 바랍니다.