Python:杀死线程

Python: Kill Thread

我正在从我的 Python 3.4 程序启动一个主程序 Thread,该程序启动各种子线程(在本例中为 daemon 线程)。

我想杀死主线程并重新启动它。

出于某种原因,这是一项极其困难的任务。在有人建议我使用 multiprocessing.ProcessProcess.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...         

我想让主线程,包括所有子线程退出,然后再启动。我怎样才能做到这一点?在我的真实程序中,我的子线程有子线程(所有守护进程)。非常感谢任何帮助!

您只需要一种方法来告诉子线程停止。我会这样做:

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(),但无论哪种方式都有效。如果您想等待子线程清理,您也可以考虑在 main_thread() 退出之前执行 t1.join()