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

이 튜토리얼은 Python의 내장 시간 모듈에서 sleep() 함수를 사용하여 코드에 시간 지연을 추가하는 방법을 알려줍니다.

간단한 Python 프로그램을 실행하면 코드 실행이 시간 지연 없이 순차적으로(하나의 명령문 다음에 다른 명령문으로) 발생합니다. 그러나 경우에 따라 코드 실행을 지연해야 할 수도 있습니다. Python 내장 시간 모듈의 sleep() 함수가 이를 수행하는 데 도움이 됩니다.

이 자습서에서는 Python에서 sleep() 함수를 사용하는 구문과 작동 방식을 이해하기 위한 몇 가지 예를 배웁니다. 시작하자!

Python time.sleep() 구문

Python 표준 라이브러리에 내장된 time 모듈은 몇 가지 유용한 시간 관련 함수를 제공합니다. 첫 번째 단계로 시간 모듈을 작업 환경으로 가져옵니다.

import time

sleep() 함수는 시간 모듈의 일부이므로 이제 다음 일반 구문으로 액세스하고 사용할 수 있습니다.

time.sleep(n) 

여기서 n은 잠자기 시간(초)입니다. 정수 또는 부동 소수점 숫자일 수 있습니다.

때로는 필요한 지연이 몇 밀리초일 수 있습니다. 이러한 경우 밀리초 단위의 기간을 초로 변환하고 절전 함수 호출에 사용할 수 있습니다. 예를 들어 100밀리초의 지연을 도입하려는 경우 time.sleep(0.1)과 같이 0.1초로 지정할 수 있습니다.

▶ 시간 모듈에서 절전 기능만 가져올 수도 있습니다.

from time import sleep

위의 가져오기 방법을 사용하면 time.sleep()을 사용하지 않고 sleep() 함수를 직접 호출할 수 있습니다.

이제 Python sleep() 함수의 구문을 배웠으므로 예제를 코딩하여 함수가 실제로 작동하는지 살펴보겠습니다. 이 GitHub 리포지토리의 python-sleep 폴더에서 이 자습서에 사용된 Python 스크립트를 다운로드할 수 있습니다. 👩🏽‍💻

sleep()을 사용한 지연 코드 실행

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

  완료하려면 재부팅이 필요한 시스템 복구가 보류 중입니다.

다음 코드 스니펫에서:

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

print("Print now")
time.sleep(5)
print("Print after sleeping for 5 seconds")

이제 simple_example.py 파일을 실행하고 출력을 관찰합니다.

$ python3 simple_example.py

코드 블록에 다른 지연 추가

이전 예제에서는 두 개의 print() 문 실행 사이에 5초의 고정 지연을 도입했습니다. 다음으로, iterable을 반복할 때 다른 지연 시간을 도입하는 또 다른 예제를 코딩해 보겠습니다.

이 예에서는 다음을 수행하려고 합니다.

  • 문장을 반복하고 각 단어에 액세스하여 인쇄합니다.
  • 각 단어를 인쇄한 후 문장의 다음 단어를 인쇄하기 전에 특정 시간 동안 기다리고 싶습니다.

문자열 문자열을 통한 루핑

문자열, 문장을 고려하십시오. 각 단어가 그 자체로 문자열인 문자열입니다.

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

>>> sentence = "How long will this take?"
>>> for char in sentence:
...     print(char)

# Output (truncated for readability)
H
o
w
.
.
.
t
a
k
e
?

그러나 이것은 우리가 원하는 것이 아닙니다. 문장을 반복하고 각 단어에 액세스하고 싶습니다. 이를 위해 문장 문자열에서 split() 메서드를 호출할 수 있습니다. 이렇게 하면 모든 공백에 대해 문장 문자열을 분할하여 얻은 문자열 목록이 반환됩니다.

>>> sentence.split()
['How', 'long', 'will', 'this', 'take?']
>>> for word in sentence.split():
...     print(word)

# Output
How
long
will
this
take?

지연이 다른 Iterables를 통한 루핑

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

  • sentence는 각 단어에 액세스하기 위해 반복하고 싶은 문자열입니다.
  • delay_times는 루프를 통과할 때마다 sleep() 함수의 인수로 사용할 지연 시간 목록입니다.

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

Python zip() 함수: zip(list1, list2)는 튜플의 반복자를 반환합니다. 여기서 각 튜플은 list1과 list2의 인덱스 i에 있는 항목을 포함합니다.

# /python-sleep/delay_times.py
import time

sleep_times = [3,4,1.5,2,0.75]
sentence = "How long will this take?"
for sleep_time,word in zip(sleep_times,sentence.split()):
    print(word)
    time.sleep(sleep_time)

절전 기능이 없으면 컨트롤이 즉시 다음 반복으로 진행됩니다. 지연을 도입했기 때문에 루프를 통한 다음 통과는 절전 작업이 완료된 후에만 발생합니다.

  "YMMV"는 무엇을 의미하며 어떻게 사용합니까?

이제 delay_times.py를 실행하고 출력을 관찰하십시오.

$ python3 delay_times.py

문자열의 후속 단어는 지연 후에 인쇄됩니다. 문자열에서 인덱스 i에 있는 단어를 인쇄한 후의 지연은 delay_times 목록에서 인덱스 i에 있는 숫자입니다.

Python의 카운트다운 타이머

다음 예제로 Python에서 간단한 카운트다운 타이머를 코딩해 보겠습니다.

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

# /python-sleep/countdown.py
import time

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

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

  • 이 함수는 숫자 n을 인수로 사용하고 해당 숫자 n부터 시작하여 0까지 카운트다운합니다.
  • 카운트 사이에 1초의 지연을 달성하기 위해 time.sleep(1)을 사용합니다.
  • 카운트가 0에 도달하면 함수는 “Ready to go!”를 인쇄합니다.

🎯 카운트다운 작업을 수행하기 위해 음의 단계 값이 -1인 range() 함수를 사용했습니다. range(n, -1, -1)은 n, n – 1, n – 2 등의 숫자 범위를 0까지 반복하는 데 도움이 됩니다. range() 함수를 사용할 때 끝점은 기본적으로 제외된다는 점을 기억하세요.

다음으로 5를 인수로 사용하여 countDown() 함수에 대한 호출을 추가해 보겠습니다.

countDown(5)

이제 countdown.py 스크립트를 실행하고 작동 중인 countDown 함수를 확인하십시오!

$ python3 countdown.py

멀티스레딩의 절전 기능

Python 스레딩 모듈은 즉시 사용 가능한 멀티스레딩 기능을 제공합니다. Python에서 Global Interpreter Lock 또는 GIL은 어느 시점에서든 활성 스레드가 하나만 실행되도록 합니다.

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

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

Python에서 스레드 생성 및 실행

func1(), func2() 및 func3() 함수를 고려하십시오. 숫자 범위를 반복하여 인쇄합니다. 그런 다음 루프를 통과할 때마다 특정 시간(초) 동안 휴면 작업이 이어집니다. 실행이 스레드 간에 동시에 전환되는 방식을 더 잘 이해하기 위해 각 함수에 대해 서로 다른 지연 시간을 사용했습니다.

import time

def func1():
    for i in range(5):
        print(f"Running t1, print {i}.")
        time.sleep(2)

def func2():
    for i  in range(5):
         print(f"Running t2, print {i}.")
         time.sleep(1)


def func3():
    for i in range(4):
         print(f"Running t3, print {i}.")
         time.sleep(0.5)

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

  Fedora Linux에 소프트웨어를 설치하는 방법

이 예에서 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"Running t1, print {i}.")
        time.sleep(2)

def func2():
    for i  in range(5):
         print(f"Running t2, print {i}.")
         time.sleep(1)

def func3():
    for i in range(4):
         print(f"Running t3, print {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초의 가장 긴 절전 시간을 가지므로 실행을 완료하는 마지막 스레드입니다.

자세한 내용은 Python의 다중 스레딩 기본 사항에 대한 자습서를 읽어보십시오.

결론

이 자습서에서는 Python의 sleep() 함수를 사용하여 코드에 시간 지연을 추가하는 방법을 배웠습니다.

내장 시간 모듈인 time.sleep()에서 sleep() 함수에 액세스할 수 있습니다. 실행을 n초 지연시키려면 time.sleep(n)을 사용하십시오. 또한 다른 값, 카운트다운 및 다중 스레딩으로 루프에서 후속 반복을 지연시키는 예를 보았습니다.

이제 시간 모듈의 고급 기능을 탐색할 수 있습니다. Python에서 날짜와 시간으로 작업하고 싶습니까? time 모듈 외에도 datetime 및 calendar 모듈의 기능을 활용할 수 있습니다.

다음은 파이썬으로 시차 계산하는 법을 배워봅니다.⏰