파이썬 스레딩 할때 함수를 중간에 종료시키는법
조회수 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()
댓글 입력