반응형
스레드나 멀티 프로세스를 이용하여 특정 시간이 지난 후 함수를 종료하는 방법을 알아보도록 하겠습니다.
# 시간이 지난 후 스레드 종료하기(원하는곳에서 종료가능)
import threading
import time
from apscheduler.schedulers.background import BackgroundScheduler
def start():
print("start")
t = threading.Thread(target=run, args=("run함수",))
t.start()
return t
def run(arg):
print("run")
t = threading.currentThread()
while getattr(t, 'do_run', True): # do_run 값이 정의되지 않는 경우 True 반환
print("%s 작동중~~" % arg)
time.sleep(1)
def stop(t):
t.do_run = False
t.join()
print("stop")
sched.remove_job('job1')
sched = BackgroundScheduler()
sched.start()
t = start()
sched.add_job(stop, 'interval', seconds=5, args=(t,), id='job1')
while True:
print('메인 스레드 도는 중...')
time.sleep(1)
apscheduler를 통해서 add_job을 해줄 경우 메인스레드가 지속적으로 돌아가면서 특정 시간후 지난 후 함수를 종료 할 수 있다. time.sleep을 통해서 할 경우 메인스레드가 그 동안 멈춰있기 때문에 그에 대한 대안이라고 생각하면 좋을것 같다. 다만 apscheduler의 경우 지속적으로 job이 호출 되기 때문에 stop 메소드에서 remove_job을 해줘야 더 이상 job이 호출되지 않는다.
위 방법은 currentThread를 받아와서 스레드가 갖고 있는 flag(do_run)에 따라 메소드가 종료된다.
getattr(t, 'do\_run', True)
는 t가 do_run라는 값을 갖고 있으면 그 값을 반환하고, 없는 경우 True를 반환한다는 의미다.
# 멀티프로세싱을 사용하는 경우는 강제로 종료 가능..
import multiprocessing
from multiprocessing import freeze_support
import time
def run(arg):
print("run")
while True:
print("%s 작동중~~" % arg)
time.sleep(1)
if __name__ == '__main__':
freeze_support()
proc = multiprocessing.Process(target=run, args=('run함수',))
proc.start()
time.sleep(5)
proc.terminate()
proc.join()
print("종료")
multiprocessing을 통해서 할 경우는 훨씬 간단하다.(메인 스레드를 자유롭게 두고 싶다면 위처럼 코드를 수정하면된다.)
다만 스레드 방식과 다르게 원하는 부분에서 끝낼수 없다는게 단점이다.(말 그대로 강제 종료이다)
반응형
'Python' 카테고리의 다른 글
파이썬 regex 정규표현식으로 match된 부분 while문으로 하나씩 변경하기 (0) | 2021.05.25 |
---|---|
pymysql 특수문자 이모티콘 에러 발생 해결법 (0) | 2021.05.18 |
파이썬 Turtle을 사용해서 다양한 도형 그려보기 (1) | 2021.04.21 |
numpy 정리 (0) | 2021.03.12 |
주피터 노트북(jupyter notebook) pdf 변환 (0) | 2021.03.04 |