규도자 개발 블로그
Python에서 setInterval함수 쓰기 (특정 시간마다 함수 반복하기) 본문
Python에서 setInterval함수 쓰기 (특정 시간마다 함수 반복하기)
자바스크립트에는 참 편한 함수가 많다. 그 중 하나인 setInterval인데 이 함수가 뭐냐 하면 특정 함수를 정해진 시간마다 반복해주는 함수이다. 애초에 이 글을 보고 있다는 건 setInterval이 어떤 역할을 하는지 알고 있는 사람일테니 이에 대한 설명은 각설하고 이 함수를 사용하면 된다.
import threading
def set_interval(func, sec):
def func_wrapper():
set_interval(func, sec)
func()
t = threading.Timer(sec, func_wrapper)
t.start()
return t
일단 이 함수를 쓰기 전에 python은 GIL이라는 개념이 적용돼있으니 주의해서 쓰길 바란다. 자세한 설명은 이 글을 참고하면 될 것이다. 설명이 아주 잘 돼있다.
아무튼 위 함수를 활용해서 마치 JS의 setInterval로 작동되는 함수를 만들어보자.
import threading
from datetime import datetime
def set_interval(func, sec):
def func_wrapper():
set_interval(func, sec)
func()
t = threading.Timer(sec, func_wrapper)
t.start()
return t
def i_wanna_interval():
print(datetime.now(), "Hi")
set_interval(i_wanna_interval, 10)
이 코드를 작동시키면 아래와 같은 결과를 확인할 수 있다.
2022-01-08 22:34:46.955962 Hi
2022-01-08 22:34:56.960422 Hi
이렇게 말이다. 알아둬야할 점이 있다면 코드를 실행하는 순간 함수가 바로 실행된 다음 10초 후에 등록되는 것이 아니라 10초 후에 해당 함수가 작동하게 등록하는 것이므로 만약에 처음 코드를 실행했을 때 함수를 실행한 뒤에 계속해서 인터벌로 돌리고 싶은 거라면
i_wanna_interval()
set_interval(i_wanna_interval, 10)
이런식으로 작성해줘야 한다.
근데 또 모자란 게 있다. 매개변수를 어떻게 넘기지 하는 고민이 있을 수 있다. 만약에 하나의 매개변수만을 고정적으로 쓰는 함수라면
import threading
from datetime import datetime
def set_interval(func, sec, param):
def func_wrapper():
set_interval(func, sec, param)
func(param)
t = threading.Timer(sec, func_wrapper)
t.start()
return t
def i_wanna_interval(comment):
print(datetime.now(), comment)
set_interval(i_wanna_interval, 10, "say HI")
이런식으로 작성하면 된다. 이 함수를 실행시키면
2022-01-08 22:40:14.042733 say HI
2022-01-08 22:40:24.047804 say HI
2022-01-08 22:40:34.052457 say HI
이런 결과값을 확인할 수 있다. 하지만 여러곳에서 쓰면서 또 매개변수도 어떤 건 한 개, 어떤 건 두 개씩 날려야 한다면 또 방법이 있다. 그건 바로 파이썬의 꽃, asterisk(*)
def i_need_one_param(param):
print(datetime.now(), param)
def i_need_two_params(param1, param2):
print(datetime.now(), param1, param2)
만약에 이렇게 매개변수가 한개인 함수나 두개의 인수 전부에 set_interval을 써야 한다고 해서 매개변수 개수에 맞게 set_interval함수를 새로 만들어서 지정해주는 건 정말 멋지지 않은 방법일 것이다. 파이써닉하지도 않고 말이다. 그럴땐 이렇게 해결할 수 있다.
import threading
from datetime import datetime
def set_interval(func, sec, *param):
def func_wrapper():
set_interval(func, sec, *param)
func(*param)
t = threading.Timer(sec, func_wrapper)
t.start()
return t
def i_need_one_param(param):
print(datetime.now(), param)
def i_need_two_params(param1, param2):
print(datetime.now(), param1, param2)
set_interval(i_need_one_param, 10, 'i need one')
set_interval(i_need_two_params, 10, 'i need two', 'like i said')
이렇게 작성하면 아래와 같은 결과값을 확인할 수 있다.
2022-01-08 22:46:21.522809 i need one
2022-01-08 22:46:21.522990 i need two like i said
2022-01-08 22:46:31.527147 i need two like i said
2022-01-08 22:46:31.527264 i need one
2022-01-08 22:46:41.5279402022-01-08 22:46:41.527973 i need two like i said
i need one
2022-01-08 22:46:51.532616 i need one
2022-01-08 22:46:51.532705 i need two like i said
2022-01-08 22:47:01.536695 i need two like i said
2022-01-08 22:47:01.536804 i need one
2022-01-08 22:47:11.540445 i need one
2022-01-08 22:47:11.540556 i need two like i said
2022-01-08 22:47:21.545696 i need two like i said
2022-01-08 22:47:21.545789 i need one
이렇게 js의 setInterval을 흉내내보는 함수를 사용해보았다. 로컬에서 뭔가 스케쥴러를 만들긴 귀찮고 시간에 그렇게 민감하지 않은 작업을 작성할 때 유용하게 쓰인다.
'Python > Python' 카테고리의 다른 글
[Python] csv를 dict로 (1) | 2022.02.09 |
---|---|
파이썬 스크립트 terminal에서 실행할 때 ModuleNotFoundError 해결하기 (0) | 2022.01.09 |
pip 모든 패키지 삭제하기 + xargs명령어 (0) | 2021.12.15 |
파이썬의 대표적인 네 자료형(리스트, 셋, 튜플, 딕셔너리) 특성 알아보기 (0) | 2021.10.04 |
파이썬으로 여러 개의 웹소켓에 동시에 연결하기 (4) | 2021.04.20 |