파이썬 스레딩 할때 함수를 중간에 종료시키는법

조회수 8162회
import time
from threading import Thread

def func1(off):
    while not off:
        for i in range(0,100):
            print (i)
            time.sleep(1)

def func2():
    total=0
    for i in range(0,30) :
        total += i
        time.sleep(0.5)

        if total >= 55 :
            return 1

off=0
t1=Thread(target=func1, args=(off,))
t2=Thread(target=func2)
t1.daemon=True
t2.daemon=True



a=t2.start()
off=a
t1.start()

input()

이렇게 작성을 했는데요 제가 하고싶은건

func1 함수를 실행시키는 도중 중간에 off 변수를 1로 바꿔서 func1함수를 종료시키고 싶거든요

종료시키는데 조건은 func2 함수처럼 같이 2개의 함수를 쓰레딩을 하면서

쓰레딩 하는 다른 함수로 인해서 func1 함수가 종료되는?

그런 그림을 그리고 있습니다 func1함수가 중간에 종료가 잘 안되네요

꼭 저런 방법 아니여도 되는데요 함수 두개를 쓰레딩 하면서 다른 하나가 하나를 종료시켜주는 방법이 필요합니다

도와주시면 감사하겠습니다

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • import threading
    import time
    
    off = 0
    class Thread1(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
            self.flag = threading.Event()
    
        def run(self):
            while not self.flag.is_set():
                print("Thread1 said : Thread %s alive\n"%self.ident)
                time.sleep(1)
            print("Thread1 said : Thread %s die\n"%self.ident)
    
    class Thread2(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
            self.flag = threading.Event()
    
        def run(self):
            global off
            for i in range(0,5):
                print("Thread2 said : %d left\n"%(5-i))
                time.sleep(1)
            off = 1 
            print("Thread2 said : Thread %s die\n"%self.ident)
    
    def main():
        try:
            j1 = Thread1()
            j2 = Thread2()
            j1.start()
            j2.start()
    
            j2.join()
            if off == 1:
                j1.flag.set()
                j1.join()
        except Exception as e:
            print(e)
    
    if __name__ == '__main__':
        main()
    
    #REF. https://www.g-loaded.eu/2016/11/24/how-to-terminate-running-python-threads-using-signals/
    #REF2. https://docs.python.org/2/library/threading.html#event-objects
    

    참고해주세용

    추가. 작성자님이 올려주신 코드 바탕으로 반영했을때입니당.

    import time
    import threading
    
    def func1():
        global flag
        flag = threading.Event()
        while not flag.is_set():
            for i in range(0,50):
                time.sleep(0.2)
        print("func1 die")
    
    def func2():
        total=0
        for i in range(0,30) :
            total += i
            time.sleep(0.5)
            if total >= 55 :
                print("func2 die")
                return 1
    
    t1=threading.Thread(target=func1)
    t2=threading.Thread(target=func2)
    t1.daemon=True
    t2.daemon=True
    
    t1.start()
    t2.start()
    t2.join()
    flag.set()
    t1.join()
    
    print("exit") #input()
    
    • 아 진짜 감사합니다 고민해봤을때 문제가 더 나와서 어떡하나 했었는데 알 수 없는 사용자 2020.8.14 14:42

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)