재귀호출 threading.Timer() 반복 실행
파이썬은 인터프리터 언어로써 하나의 메인 쓰레드가 파이썬 코드를 순차적으로 실행하고 종료 됩니다. 주기적으로 실행해야 될 함수가 있을때 threading모듈을 통해 타이머 기능을 사용할 수 있습니다.
🧩1. threading 모듈
코드를 병렬로 실행하기 위해서 threading 모듈로 별도의 쓰레드(Subthread)를 생성합니다.
- 파이썬에서 쓰레드를 실행하기 위해서는, threading 모듈의 threading.Thread() 함수를 호출하여 Thread 객체를 얻은 후 Thread 객체의 start() 메서드를 호출하게 됩니다.
- 함수 (혹은 메서드)를 작성하고 그 함수명을 threading.Thread() 함수의 target 아큐먼트에 지정하면 됩니다.
- 예를 들어, 아래 예제에서 sum 이라는 함수를 쓰레드가 실행하도록 threading.Thread() 함수의 파라미터로 target=sum 을 지정하였습니다.
- 한가지 주의할 점은 target=sum() 처럼 지정하면, 이는 sum() 함수를 실행하여 리턴한 결과를 target에 지정하는 것이므로 잘못된 결과를 초래할 수 있습니다.
- 만약 쓰레드가 실행하는 함수(혹은 메서드)에 입력 파라미터를 전달해야 한다면, args (혹은 키워드 아규먼트인 경우 kwargs) 에 필요한 파라미터를 지정하면 됩니다.
- args는 튜플로 파라미터를 전달하고, kwargs는 dict로 전달한다. 아래 예제에서 sum() 함수는 두 개의 파라미터를 받아들이기 때문에 "args=(1, 100000)" 와 같이 입력파라미터를 지정합니다.
import threading
def sum(low, high):
total = 0
for i in range(low, high):
total += i
print("Subthread", total)
t = threading.Thread(target=sum, args=(1, 100000))
t.start()
print("Main Thread")
🧩2. Timer() 함수 사용
주기적으로 호출할 함수 내에서 자기를 호출합니다.
- 주기적으로 호출할 startTimer() 함수를 만들고 함수내에서 threading.Timer() 로 함수를 호출합니다.
- Timer(a,b) 함수는 두 가지 인자를 갖게되는데 a는 반복주기 시간(초)이고, b는 호출할 함수 이름입니다.
import threading
def startTimer():
print("Timer")
timer = threading.Timer(5, startTimer)
timer.start()
if __name__ == '__main__':
startTimer()
🧩[참고] time 모듈로 타이머 실행
threading 모듈은 재귀호출 기능이지만, time 모듈은 시계 기능입니다.
- time.sleep(초) 함수를 통한 타이머
import time
in_sec = input("시간을 입력하세요.(초):")
sec = int(in_sec)
print(sec)
#while은 반복문으로 sec가 0이 되면 반복을 멈춰라
while (sec != 0 ):
sec = sec-1
time.sleep(1)
print(sec)
- time.time(초) 함수를 통한 스톱워치
import time
#타이머 시작점
start = input("Enter를 누르면 타이머를 시작합니다.")
begin = time.time()
#타이머 종료점
stop = input("Enter를 누르면 측정을 종료합니다.")
end = time.time()
#시간차
result = end - begin
#여기서 round는 파이썬에서 소수점 자리수 조절에 활용됩니다.
result = round(result,3)
print("시작 후", result, "초의 시간이 흘렀습니다.")
추가 참고 자료
예제로 배우는 파이썬 프로그래밍 - 쓰레드 를 참조하였습니다.
파이썬 타이머 사용하기 를 참조하였습니다.
[Python] 파이썬으로 타이머 만들기 (Feat. Time 모듈) 을 참조하였습니다.
0 댓글