Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Python:杀死线程_Multithreading_Python 3.x_Python 3.4_Python Multithreading - Fatal编程技术网

Multithreading Python:杀死线程

Multithreading Python:杀死线程,multithreading,python-3.x,python-3.4,python-multithreading,Multithreading,Python 3.x,Python 3.4,Python Multithreading,我正在从我的python3.4程序启动一个主Thread,该程序启动各种子线程(在本例中为daemonthreads) 我想终止主线程并重新启动它。 出于某种原因,这是一项极其困难的任务。在有人建议我使用multiprocessing.Process和Process.terminate()而不是Thread之前,我不能这样做,因为我的实际程序必须与所有线程和子线程共享一个公共sqlite3连接,而我不能使用进程 目前,我正在使用队列向主线程发出信号,它应该使用sys.exit()退出,但这不起作

我正在从我的
python3.4
程序启动一个主
Thread
,该程序启动各种子线程(在本例中为
daemon
threads)

我想终止主线程并重新启动它。

出于某种原因,这是一项极其困难的任务。在有人建议我使用
multiprocessing.Process
Process.terminate()
而不是
Thread
之前,我不能这样做,因为我的实际程序必须与所有线程和子线程共享一个公共
sqlite3
连接,而我不能使用进程

目前,我正在使用
队列
向主线程发出信号,它应该使用
sys.exit()
退出,但这不起作用,正如您在下面看到的。
我尝试了
os.\u 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()
,但这两种方法都有效。如果你想等待子线程的清理,你也可以考虑在Tun.Cube()/代码> <代码> MeNethTHead()/Cux>出口之前。你只需要一种方法来告诉子线程停止。我会这样做:

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()
,但这两种方法都有效。如果你想等待子线程清理,你也可以考虑在<代码> Trime> MeNethTHead()/Cux>出口之前执行<代码> T1.