규도자 개발 블로그

Python에서 setInterval함수 쓰기 (특정 시간마다 함수 반복하기) 본문

Python/Python

Python에서 setInterval함수 쓰기 (특정 시간마다 함수 반복하기)

규도자 (gyudoza) 2022. 1. 8. 22:53

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을 흉내내보는 함수를 사용해보았다. 로컬에서 뭔가 스케쥴러를 만들긴 귀찮고 시간에 그렇게 민감하지 않은 작업을 작성할 때 유용하게 쓰인다.

 

Comments