매일 업데이트
2022-12-01 07:54 10 min

코드에 지연을 추가하는 방법

이 가이드는 파이썬의 내장된 시간 모듈에서 제공하는 sleep() 함수를 활용하여 코드 실행에 시간 지연을 추가하는 방법에 대해 설명합니다.

일반적인 파이썬 프로그램에서는 코드 명령어가 시간 지연 없이 순차적으로 실행됩니다. 하지만 때로는 코드 실행을 일시적으로 중단해야 할 필요가 있습니다. 이때 파이썬 시간 모듈의 sleep() 함수가 유용하게 사용됩니다.

본 튜토리얼에서는 sleep() 함수의 문법과 작동 방식을 실제 예제와 함께 자세히 알아보겠습니다. 시작해 볼까요?

파이썬 time.sleep() 함수 문법

파이썬 표준 라이브러리에 포함된 시간 모듈은 시간과 관련된 다양한 함수를 제공합니다. 가장 먼저, 시간 모듈을 작업 환경으로 불러와야 합니다.

import time

sleep() 함수는 시간 모듈의 일부이므로, 아래와 같은 일반적인 문법을 사용하여 접근하고 사용할 수 있습니다.

time.sleep(n)

여기서 n은 코드를 일시 중단할 시간(초)을 나타냅니다. n은 정수 또는 부동 소수점 숫자가 될 수 있습니다.

간혹 필요한 지연 시간이 밀리초 단위일 수 있습니다. 이 경우, 밀리초 단위를 초 단위로 변환하여 sleep() 함수 호출에 사용할 수 있습니다. 예를 들어, 100밀리초의 지연을 주려면 time.sleep(0.1)과 같이 0.1초로 지정하면 됩니다.

▶ 또는 시간 모듈에서 sleep 함수만을 직접 가져와 사용할 수도 있습니다.

from time import sleep

위와 같이 가져오면 time.sleep() 대신 sleep() 함수를 직접 호출할 수 있습니다.

이제 파이썬 sleep() 함수의 문법을 이해했으니, 실제 예제를 통해 함수가 어떻게 작동하는지 확인해 보겠습니다. 이 튜토리얼에 사용된 파이썬 스크립트는 GitHub 리포지토리의 python-sleep 폴더에서 다운로드할 수 있습니다. 👩🏽‍💻

sleep() 함수를 이용한 코드 실행 지연

첫 번째 예제로, sleep 함수를 사용하여 간단한 파이썬 프로그램의 실행을 지연시켜 보겠습니다.

다음 코드 조각을 보면:

  • 첫 번째 print() 문은 지연 없이 즉시 실행됩니다.
  • 그 다음, sleep() 함수를 사용하여 5초의 지연을 추가합니다.
  • 두 번째 print() 문은 sleep() 작업이 완료된 후에 실행됩니다.
# /python-sleep/simple_example.py
import time

print("지금 출력")
time.sleep(5)
print("5초 지연 후 출력")

이제 simple_example.py 파일을 실행하고 결과를 확인해 보세요.

$ python3 simple_example.py

코드 블록에 다양한 지연 추가하기

이전 예제에서는 두 개의 print() 문 사이에 5초의 고정된 지연 시간을 설정했습니다. 다음으로, 반복 가능한 객체를 반복하면서 각각 다른 지연 시간을 적용하는 예제를 살펴보겠습니다.

이 예에서는 다음과 같은 작업을 수행합니다.

  • 문장을 반복하면서 각 단어를 추출하여 출력합니다.
  • 각 단어를 출력한 후, 다음 단어를 출력하기 전에 잠시 기다립니다.

문자열을 이루는 문자열을 반복하기

문자열로 이루어진 문장을 생각해 봅시다. 각 단어가 그 자체로 문자열입니다.

문자열을 반복하면 다음과 같이 각 문자를 얻게 됩니다.

>>> sentence = "이 문장은 얼마나 걸릴까요?"
>>> for char in sentence:
...     print(char)

# 출력 결과 (가독성을 위해 일부 생략)
이
 
문
장
은
.
.
.
까
요
?

하지만 우리가 원하는 것은 이것이 아닙니다. 문장을 반복하면서 각 단어에 접근하고 싶습니다. 이를 위해 문장 문자열에서 split() 메서드를 사용할 수 있습니다. 이렇게 하면 공백을 기준으로 문장 문자열을 분할하여 얻은 단어 목록이 반환됩니다.

>>> sentence.split()
['이', '문장은', '얼마나', '걸릴까요?']
>>> for word in sentence.split():
...     print(word)

# 출력 결과
이
문장은
얼마나
걸릴까요?

지연 시간이 다른 반복 가능한 객체 반복하기

예제를 다시 살펴보겠습니다.

  • sentence는 각 단어를 접근하기 위해 반복할 문자열입니다.
  • sleep_times는 반복문을 진행하면서 sleep() 함수의 인수로 사용될 지연 시간 목록입니다.

여기서는 두 개의 목록, sleep_times 목록과 문장 문자열을 분할하여 얻은 문자열 목록을 동시에 반복하고 싶습니다. zip() 함수를 사용하여 이러한 병렬 반복을 수행할 수 있습니다.

파이썬 zip() 함수: zip(list1, list2)는 튜플의 반복자를 반환합니다. 각 튜플은 list1list2의 인덱스 i에 있는 항목을 포함합니다.

# /python-sleep/delay_times.py
import time

sleep_times = [3, 4, 1.5, 2, 0.75]
sentence = "이 문장은 얼마나 걸릴까요?"
for sleep_time, word in zip(sleep_times, sentence.split()):
    print(word)
    time.sleep(sleep_time)

만약 sleep 함수가 없다면 제어는 즉시 다음 반복으로 진행될 것입니다. 하지만 지연이 추가되었기 때문에 다음 반복은 sleep 작업이 완료된 후에만 발생합니다.

이제 delay_times.py를 실행하고 결과를 확인해 보세요.

$ python3 delay_times.py

문자열의 다음 단어는 각 지연 시간 후에 출력됩니다. 문자열에서 인덱스 i에 있는 단어를 출력한 후의 지연 시간은 sleep_times 목록에서 인덱스 i에 있는 숫자입니다.

파이썬 카운트다운 타이머 만들기

다음 예제로 파이썬에서 간단한 카운트다운 타이머를 만들어 보겠습니다.

countDown() 함수를 정의해 봅시다.

# /python-sleep/countdown.py
import time

def countDown(n):
    for i in range(n, -1, -1):
        if i == 0:
            print("시작!")
        else:
             print(i)
             time.sleep(1)

다음으로 countDown() 함수의 정의를 분석해 보겠습니다.

  • 이 함수는 숫자 n을 인수로 받아, 그 숫자부터 0까지 카운트다운합니다.
  • 카운트 사이의 1초 지연을 위해 time.sleep(1)을 사용합니다.
  • 카운트가 0에 도달하면 함수는 "시작!"을 출력합니다.

🎯 카운트다운 작업을 수행하기 위해 음수 단계 값인 -1을 사용한 range() 함수를 활용했습니다. range(n, -1, -1)n, n - 1, n - 2 등의 숫자 범위를 0까지 반복하는 데 유용합니다. range() 함수를 사용할 때 끝점은 기본적으로 포함되지 않는다는 점을 기억하세요.

다음으로 5를 인수로 하여 countDown() 함수를 호출해 보겠습니다.

countDown(5)

이제 countdown.py 스크립트를 실행하고 작동 중인 countDown 함수를 확인해 보세요!

$ python3 countdown.py

멀티스레딩에서의 sleep() 함수

파이썬 스레딩 모듈은 멀티스레딩 기능을 간편하게 제공합니다. 파이썬에서 GIL(Global Interpreter Lock)은 한 번에 하나의 스레드만 실행되도록 합니다.

하지만 I/O 작업이나 sleep과 같은 대기 작업 중에는 프로세서가 현재 스레드의 실행을 일시 중단하고 대기 중인 다른 스레드로 전환할 수 있습니다.

이것이 어떻게 작동하는지 이해하기 위해 예제를 살펴보겠습니다.

파이썬에서 스레드 생성 및 실행

func1(), func2(), func3() 함수를 생각해 봅시다. 이 함수들은 숫자 범위를 반복하여 출력합니다. 루프를 돌 때마다 특정 시간(초) 동안 일시 중단됩니다. 스레드 간에 실행이 어떻게 번갈아 가는지 더 잘 이해하기 위해, 각 함수에 다른 지연 시간을 설정했습니다.

import time

def func1():
    for i in range(5):
        print(f"t1 실행 중, 출력 {i}.")
        time.sleep(2)

def func2():
    for i  in range(5):
         print(f"t2 실행 중, 출력 {i}.")
         time.sleep(1)


def func3():
    for i in range(4):
         print(f"t3 실행 중, 출력 {i}.")
         time.sleep(0.5)

파이썬에서는 Thread() 생성자를 사용하여 스레드 객체를 만들 수 있습니다. threading.Thread(target = …, args = …) 구문을 사용하면 args 튜플에 지정된 인수로 대상 함수를 실행하는 스레드가 생성됩니다.

이 예제에서 func1, func2, func3 함수는 인수를 사용하지 않습니다. 따라서 함수의 이름만 대상으로 지정하면 됩니다. 그런 다음 각각 func1, func2, func3을 대상으로 하는 스레드 객체 t1, t2, t3을 정의합니다.

t1 = threading.Thread(target=func1)
t2 = threading.Thread(target=func2)
t3 = threading.Thread(target=func3)

t1.start()
t2.start()
t3.start()

스레딩 예제의 전체 코드는 다음과 같습니다.

# /python-sleep/threads.py
import time
import threading

def func1():
    for i in range(5):
        print(f"t1 실행 중, 출력 {i}.")
        time.sleep(2)

def func2():
    for i  in range(5):
         print(f"t2 실행 중, 출력 {i}.")
         time.sleep(1)

def func3():
    for i in range(4):
         print(f"t3 실행 중, 출력 {i}.")
         time.sleep(0.5)

t1 = threading.Thread(target=func1)
t2 = threading.Thread(target=func2)
t3 = threading.Thread(target=func3)

t1.start()
t2.start()
t3.start()

출력을 보면, 실행이 세 스레드 사이에서 번갈아 가면서 진행되는 것을 볼 수 있습니다. 스레드 t3은 대기 시간이 가장 짧으므로 가장 짧은 시간 동안 일시 중단됩니다. 스레드 t1은 2초로 가장 긴 sleep 시간을 가지므로, 마지막으로 실행을 완료하게 됩니다.

자세한 내용은 파이썬 멀티스레딩 기본 사항에 대한 튜토리얼을 참고하십시오.

결론

이 가이드에서는 파이썬에서 sleep() 함수를 사용하여 코드에 시간 지연을 추가하는 방법을 알아보았습니다.

내장된 시간 모듈 time.sleep()을 통해 sleep() 함수에 접근할 수 있습니다. time.sleep(n)을 사용하여 실행을 n초 동안 지연시킬 수 있습니다. 또한, 다양한 값, 카운트다운, 멀티스레딩을 이용하여 반복문에서 후속 반복을 지연시키는 방법을 살펴보았습니다.

이제 시간 모듈의 더 고급 기능을 탐색해 볼 수 있습니다. 파이썬에서 날짜와 시간을 다루고 싶으신가요? time 모듈 외에도 datetimecalendar 모듈의 기능을 활용할 수 있습니다.

다음은 파이썬으로 시간차를 계산하는 방법을 배워보세요. ⏰

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.