인생마린
어떤 공부 블로거의 금서목록
인생마린
전체 방문자
오늘
어제
  • 전체 (155)
    • C언어 (19)
    • Python (14)
      • Flask (0)
    • Coding Challenge (11)
      • Code Clone & Review (0)
      • Toy Project (0)
      • 오늘의 코드 (5)
    • Algorithm (6)
    • JAVA (8)
    • 웹 (8)
      • Javascript (3)
    • 정보보안 (19)
    • 기타 (21)
    • 일기는일기장에 (2)
    • 리눅스 (4)
    • 철학 (1)
    • 주식 (14)
    • AI (2)
    • 독후감 (13)
    • 프로그래밍 (4)
    • 게임 (1)
    • Devops (2)
      • CI_CD (2)
      • AWS (0)
    • Flutter (3)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 백테스팅
  • Regex
  • Flutter
  • 주린이 #주식
  • best of best
  • Bitcoin
  • smtplib
  • Sphinx
  • 폭락
  • 주식 #ETF
  • Java
  • Regular Expression
  • 퀴즈봇
  • c언어
  • 가상화폐
  • vpn
  • 카카오톡봇
  • 코인
  • flask
  • 불편한사회
  • Python
  • 정규표현식
  • python #eval #dictionary
  • 해커톤
  • 우영우 #패러디논란
  • TFT
  • 비트코인
  • turtle
  • 테라
  • 주식 #배당주

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
인생마린

어떤 공부 블로거의 금서목록

Python

파이썬 특정 시간이 지난 후 함수 종료하기

2021. 3. 4. 12:24
반응형

스레드나 멀티 프로세스를 이용하여 특정 시간이 지난 후 함수를 종료하는 방법을 알아보도록 하겠습니다.

# 시간이 지난 후 스레드 종료하기(원하는곳에서 종료가능)
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
    'Python' 카테고리의 다른 글
    • pymysql 특수문자 이모티콘 에러 발생 해결법
    • 파이썬 Turtle을 사용해서 다양한 도형 그려보기
    • numpy 정리
    • 주피터 노트북(jupyter notebook) pdf 변환
    인생마린
    인생마린
    즐거운 프로그래밍~♬

    티스토리툴바