我如何在Python中杀死这个线程

-2 python multithreading kill func

在这段代码中

杀=假

a = tr.Thread(target=func, args=(a, b, Kill), daemon=True)

a.start()

这是一个 tkinter 应用程序,所以我如何杀死这个线程,就像用什么命令来做到这一点。

小智 5

有不同的方法kill可以thread

  • 在上面的代码中,一旦global variable stop_threads设置了,target function run()就可以使用 t1.join() 来终止线程 t1 和结束。但由于某些原因,人们可能会避免使用全局变量。对于这些情况,可以传递函数对象来提供类似的功能,如下所示。
# Python program killing 
# threads using stop 
# flag 
import threading 
import time 
def run(stop): 
    while True: 
        print('thread running') 
        if stop(): 
                break
def main(): 
        stop_threads = False
        t1 = threading.Thread(target = run, args =(lambda : stop_threads, )) 
        t1.start() 
        time.sleep(1) 
        stop_threads = True
        t1.join() 
        print('thread killed') 
main() 
Run Code Online (Sandbox Code Playgroud)

上面代码中传递的函数对象始终返回local variable stop_threads. 该值在函数 run() 中检查,一旦stop_threads重置,run()函数就会结束并且线程可以被杀死。

  • 使用跟踪来终止线程:此方法通过在每个线程中安装跟踪来工作。每个跟踪在检测到某些刺激或标志时自行终止,从而立即终止关联的线程。例如
# Python program using 
# traces to kill threads 

import sys 
import trace 
import threading 
import time 
class thread_with_trace(threading.Thread): 
  def __init__(self, *args, **keywords): 
    threading.Thread.__init__(self, *args, **keywords) 
    self.killed = False
  def start(self): 
    self.__run_backup = self.run 
    self.run = self.__run       
    threading.Thread.start(self) 

  def __run(self): 
    sys.settrace(self.globaltrace) 
    self.__run_backup() 
    self.run = self.__run_backup 
  def globaltrace(self, frame, event, arg): 
    if event == 'call': 
      return self.localtrace 
    else: 
      return None

  def localtrace(self, frame, event, arg): 
    if self.killed: 
      if event == 'line': 
        raise SystemExit() 
    return self.localtrace 
  def kill(self): 
    self.killed = True
def func(): 
  while True: 
    print('thread running') 
t1 = thread_with_trace(target = func) 
t1.start() 

time.sleep(2) 
t1.kill() 
t1.join() 

if not t1.isAlive(): 

  print('thread killed') 
Run Code Online (Sandbox Code Playgroud)

在此代码中, start()稍加修改即可使用settrace(). 本地跟踪函数的定义是,每当设置各自的终止标志(killed)时thread,在执行下一行代码时会引发 SystemExit 异常,从而结束目标函数 func 的执行。现在可以使用 来终止该线程 join()