콘텐츠로 건너뛰기

파이썬에서 대기(waiting) 기능을 사용하는 방법은?

CodeMDD.io

Python sleep(): Python 코드에서 대기 시간 추가하기

대기 시간을 필요로 할 때는 프로그램이 가능한 빨리 실행되도록 하고 싶은 경우가 대부분입니다. 그러나 파일 업로드 또는 다운로드, 그래픽 로드 또는 화면에 그려지기를 기다려야 할 때와 같이 경우에 따라 코드를 잠시 대기하도록 하는 것이 좋을 수도 있습니다. 웹 API 호출 또는 데이터베이스 쿼리 사이에서도 중단이 필요할 수 있습니다. Python 프로그램에 대기 시간을 추가하는 것은 이러한 각 경우와 그 이상에 도움이 될 수 있습니다!

이 튜토리얼에서는 다음을 사용하여 Python sleep() 호출을 추가하는 방법을 배워보겠습니다.

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

이 문서는 Python 지식을 키우려는 중급 개발자를 대상으로 합니다. 그럼 시작해봅시다!

time.sleep()을 사용하여 Python sleep() 호출 추가하기

time.sleep()를 사용하는 예시는 다음과 같습니다.

import time
time.sleep(3) # 3초 동안 sleep

이 코드를 콘솔에서 실행하면 새로운 명령을 입력하기 전에 약간의 지연을 경험할 수 있습니다.

참고: Python 3.5에서는 time.sleep() 동작을 약간 변경했습니다. 새로운 Python sleep() 시스템 호출은 신호에 의해 인터럽트되더라도 지정한 시간(초) 이상 지속됩니다. 그러나 신호 자체가 예외를 발생시키는 경우는 예외입니다.

time.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의 기본적인 실행 횟수는 100만번입니다. 위의 코드를 기본 -n으로 실행하면 1회당 3초가 걸린다는 것을 알 수 있으며, 터미널이 약 34일 동안 화면에 멈춰 있을 것입니다. timeit 모듈에는 명령 줄 옵션 뿐만 아니라 다른 많은 옵션이 있으며, 공식 문서에서 확인할 수 있습니다.

좀 더 현실적인 예시를 만들어봅시다. 시스템 관리자는 웹 사이트중 하나가 다운될 때 알고 싶어 합니다. 정기적으로 웹 사이트 상태 코드를 확인할 수 있도록 하려면 다음과 같이 할 수 있습니다.

import requests
import time
url = "http:https://codemdd.io/www.example.com"
while True:
response = requests.head(url)
if response.status_code == 200:
print("Website is up!")
else:
print("Website is down!")
time.sleep(60) # 60초 동안 대기

이 예시에서는 time.sleep()을 사용하여 60초 동안 코드가 대기합니다. 이렇게하면 매 분마다 웹 사이트의 상태를 확인할 수 있습니다.

time.sleep()을 사용하면 프로그램이 일시 중지되지만 다른 스레드에는 영향을 주지 않습니다. 그러나 메인 스레드에서 time.sleep()를 호출하면 메인 스레드가 일시 중지되므로 주의해야 합니다.

Decorators를 사용하여 Python sleep() 호출 추가하기

데코레이터는 어떤 태그를 감싸는 역할을 하며, 해당 태그와 관련된 동작을 추가하고자 할 때 사용합니다. Python에서 데코레이터를 사용하여 sleep() 호출을 추가할 수 있습니다.

데코레이터를 활용하면 함수를 감싸고 추가 동작을 수행할 수 있습니다. 아래의 예제에서는, 함수가 호출되면 먼저 sleep()을 사용하여 함수 실행 전에 대기시간을 적용합니다.

import time
def add_sleep(seconds):
def decorator(func):
def wrapper(*args, **kwargs):
time.sleep(seconds)
return func(*args, **kwargs)
return wrapper
return decorator
@add_sleep(3)
def greet(name):
print(f"Hello, {name}!")

이 예시에서는 add_sleep(seconds) 데코레이터 함수를 정의하고, 이 함수는 데코레이터를 반환합니다. add_sleep(seconds) 함수는 decorator(func) 함수를 정의하여 이 함수도 데코레이터를 반환합니다. decorator(func) 함수는 wrapper(*args, **kwargs) 함수를 정의하고, 이 함수는 대기시간을 적용한 후에 원래 함수를 호출합니다.

greet(name) 함수에 @add_sleep(3) 데코레이터를 적용하면 함수가 호출되기 전에 대기시간이 적용된 코드가 실행됩니다. 이렇게 하면 greet() 함수가 실행되기 전에 3초 동안 대기합니다.

데코레이터를 사용하면 여러 함수에 대기 시간을 동적으로 적용할 수 있으므로 코드를 더 모듈화하고 응용 프로그램의 요구에 맞게 대기 시간을 조절할 수 있습니다.

Threads를 사용하여 Python sleep() 호출 추가하기

Python에서 스레드를 사용하면 여러 작업을 동시에 실행할 수 있습니다. 여러 가지 스레드를 사용하면 동적 대기 시간이 필요한 경우에 time.sleep()가 더 유용해집니다.

threading 모듈을 사용하여 스레드를 작성하고 time.sleep()을 사용하여 스레드가 대기되도록 할 수 있습니다. 다음은 time.sleep()을 사용하여 Thread 클래스를 상속받은 사용자 정의 스레드를 만드는 예시입니다.

import threading
import time
class SleepThread(threading.Thread):
def run(self):
print("Starting SleepThread...")
time.sleep(3) # 3초 동안 스레드를 중지
print("SleepThread Ended!")
sleep_thread = SleepThread()
sleep_thread.start()

이 예시에서는 SleepThread라는 새로운 클래스를 정의하고 threading.Thread을 상속하여 스레드를 만듭니다. SleepThreadrun() 메서드에서는 스레드가 시작되면 print() 문이 실행되고, time.sleep()을 사용하여 3초 동안 스레드를 일시 중지시킵니다. 그리고 스레드가 종료되면 다시 print() 문이 실행됩니다.

SleepThread 클래스의 인스턴스를 만들고 start() 메서드를 호출하여 스레드를 시작합니다. 이렇게 하면 스레드가 시작되면 대기 시간이 적용된 SleepThread 클래스의 run() 메서드가 실행됩니다.

Async IO를 사용하여 Python sleep() 호출 추가하기

비동기 IO(Async IO)는 입출력 작업이 실행되는 동안 다른 작업을 수행할 수 있는 기능입니다. Python은 내장된 asyncio 모듈을 통해 Async IO를 지원합니다.

asyncio.sleep()을 사용하여 대기 시간을 동기적인 코드에 추가할 수 있습니다.

import asyncio
async def sleeper():
print("Starting sleeper...")
await asyncio.sleep(3) # 3초 동안 대기
print("Sleeper ended!")
asyncio.run(sleeper())

이 예시에서는 sleeper()라는 비동기 함수를 정의합니다. print() 문이 실행되면 await asyncio.sleep(3)을 사용하여 3초 동안 대기하고, 그 후에 다시 print() 문이 실행됩니다.

asyncio.run(sleeper())를 사용하여 비동기 함수를 실행합니다. 이렇게 하면 함수가 시작되면 대기 시간이 적용된 sleeper() 함수가 실행됩니다.

GUI(그래픽 사용자 인터페이스)에서 Python sleep() 호출 추가하기

GUI 프로그래밍에서 원할한 사용자 경험을 위해 프로그램의 동작을 일시 중단해야 할 때가 있습니다. Python에서는 다양한 GUI 프레임워크를 사용하여 대기 시간을 추가할 수 있습니다. 여기에서는 Tkinter와 wxPython을 사용하는 예시를 살펴보겠습니다.

Tkinter에서 대기하기

Tkinter는 가장 널리 사용되는 Python GUI 프레임워크입니다. 대기 시간은 after() 메서드를 사용하여 추가할 수 있습니다.

아래는 Tkinter에서 대기 시간을 추가하는 간단한 예시입니다.

import tkinter as tk
def greet():
def delayed_greeting():
root.after(3000, greet) # 3초 후에 greet() 함수 호출
root = tk.Tk()
button = tk.Button(root, text="Greet", command=delayed_greeting)
button.pack()
root.mainloop()

이 예시에서는 greet()이라는 함수와 delayed_greeting()이라는 함수를 정의합니다. delayed_greeting() 함수에서는 root.after(3000, greet)을 사용하여 3초 후에 greet() 함수가 호출되도록 합니다.

Tkinter를 사용하여 대기 시간을 추가하려면 after() 메서드를 사용하여 대기 시간을 지정하고 호출할 함수를 지정하면 됩니다.

wxPython에서 대기하기

wxPython은 Python에서 사용할 수 있는 운영 체제 별 그래픽 사용자 인터페이스 도구상자입니다. wxPython을 사용하여 대기 시간을 추가할 수 있습니다. 대기 시간은 wx.CallLater() 함수를 사용하여 추가할 수 있습니다.

아래는 wxPython에서 대기 시간을 추가하는 간단한 예시입니다.

import wx
class MyFrame(wx.Frame):
def __init__(self):
super().__init__(None, title="Python Sleep", size=(400, 300))
panel = wx.Panel(self)
button = wx.Button(panel, label="Greet")
button.Bind(wx.EVT_BUTTON, self.delayed_greeting)
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(button, 0, wx.ALL, 10)
panel.SetSizer(sizer)
def greet(self):
def delayed_greeting(self, event):
wx.CallLater(3000, self.greet) # 3초 후에 greet() 함수 호출
app = wx.App()
frame = MyFrame()
frame.Show()
app.MainLoop()

이 예시에서는 MyFrame 클래스에 __init__() 메서드를 정의하여 윈도우 프레임을 생성합니다. delayed_greeting() 메서드에서는 wx.CallLater(3000, self.greet)을 사용하여 3초 후에 greet() 함수가 호출되도록 합니다.

wxPython을 사용하여 대기 시간을 추가하려면 wx.CallLater() 함수를 사용하여 대기 시간을 지정하고 호출할 함수를 지정하면 됩니다.

결론

Python에서 sleep() 함수를 사용하여 프로그램에 대기 시간을 추가하는 것은 매우 유용합니다. time.sleep()을 사용하여 간단한 대기 시간을 추가하거나, 데코레이터나 스레드, Async IO, GUI 프레임워크를 활용하여 복잡한 대기 시간을 구현할 수 있습니다.

이 튜토리얼에서는 Python에서 대기 시간을 추가하는 다양한 방법에 대해 자세히 설명했습니다. 이제 여러분은 Python 코드에 상황에 맞는 대기 시간을 추가할 수 있습니다. Happy coding!