我正在从我的Thread
程序中启动一个主Python 3.4
,它启动各种子线程(在本例中为daemon
个线程)。
我想杀死主线程并重新启动它。
出于某种原因,这是一项非常困难的任务。在有人建议我使用multiprocessing.Process
和Process.terminate()
而非Thread
之前,我无法使用此路由,因为我的真实程序必须与之共享sqlite3
所有线程和子线程,我不能使用进程。
目前,我正在使用Queue
向主线程发出信号,告知它应该使用sys.exit()
退出,但这不起作用,如下所示。我试过了os._exit(0)
,但这会杀死整个翻译。
import sys
import time
from threading import Thread
from queue import Queue
t = None
q = None
def subthread1():
while True:
time.sleep(2)
print(' 1...')
def subthread2():
while True:
time.sleep(2)
print(' 2...')
def main_thread(q):
t1 = Thread(target=subthread1)
t1.daemon = True
t1.start()
t2 = Thread(target=subthread2)
t2.daemon = True
t2.start()
while True:
msg = q.get()
if msg == 0:
print("EXITING THREAD")
sys.exit()
def start():
print("STARTING")
global q, t
q = Queue()
t = Thread(target=main_thread, args=(q,))
t.start()
def kill():
print("KILLING")
global q, t
q.put(0)
def main():
start()
time.sleep(10)
kill()
time.sleep(10)
start()
if __name__ == '__main__':
main()
这会产生输出:
STARTING
1...
2...
1...
2...
2...
1...
1...
2...
2...
1...
KILLING
EXITING THREAD
2...
1...
1...
2...
2...
1...
2...
1...
STARTING
2...
1...
2...
1...
2...
1...
2...
1...
2...
1...
1...
2...
1...
2...
1...
我希望主线程(包括所有子线程)退出,然后再次启动。我怎样才能做到这一点?在我的真实程序中,我的子线程有子线程(所有守护进程)。任何帮助都非常感谢!
答案 0 :(得分:3)
你只需要一种方法来告诉子线程停止。我这样做:
def subthread1(stop):
while not stop:
time.sleep(1)
print(' 1...')
def main_thread(q):
stop = [] # list rather than boolean because we need it "by reference"
t1 = Thread(target=subthread1, args=(stop,))
t1.daemon = True
t1.start()
while True:
msg = q.get()
if msg == 0:
print("EXITING THREAD")
stop.append(True)
break
请注意,我只是使用break
而不是sys.exit()
,但它可以正常工作。如果您想等待子线程清理,您可能还会考虑在t1.join()
退出之前执行main_thread()
。