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()
,但这两种方法都有效。如果你想等待子线程的清理,你也可以考虑在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.