繁体   English   中英

如何在python脚本退出时杀死线程(如果需要)?

[英]How do I kill my thread on python script exit(If I need to)?

我正在开发一个程序,每秒从API提取数据。 因此,我有一个名为tick的函数,该函数基本上从API返回数据。 为了能够在不等待响应的情况下每秒冻结GUI的情况下,我将其放在线程上,如下所示:

def every(delay, task):
  next_time = time.time() + delay
  while True:
    time.sleep(max(0, next_time - time.time()))
    try:
      task()
    except Exception:
      traceback.print_exc()
      # in production code you might want to have this instead of course:
      # logger.exception("Problem while executing repetitive task.")
    # skip tasks if we are behind schedule:
    next_time += (time.time() - next_time) // delay * delay + delay

    ...
    ...

threading.Thread(target=lambda: every(1, tick)).start()

window.mainloop()

当我关闭GUI窗口时,python控制台会像这样疯狂:

追溯(最近一次通话最近):每个task()中的文件“ D:/PycharmProjects/test/test.py”,第22行,在tick_insert_text中的文件“ D:/PycharmProjects/test/test.py”,行66 (unn1,unn_text)文件“ D:/PycharmProjects/test/test.py”,第47行,位于insert_text entry.delete(0,END)文件“ D:\\ Python37 \\ lib \\ tkinter__init __。py”,第2676行,在删除self.tk.call(self._w,'delete',first,last)RuntimeError:主线程不在主循环中

对我来说很明显,线程没有终止。 但是我是python和线程技术的新手,所以我不知道该线程是否需要从代码中关闭,或者当我实际运行编译后的程序时,当我关闭程序窗口时它将自动关闭它。 那么,我需要从内部关闭它吗? 如果是这样,我该如何正确做呢?

您可以使用全局变量(即running )来控制while循环。

之后,您还可以使用thread.join()等待线程结束。

def every(delay, task):
  global running 

  next_time = time.time() + delay

  while running:
      ...
      ...

#---------------------------------------------

running = True
thread = threading.Thread(target=lambda: every(1, tick))
thread.start()

window.mainloop()

running = False # it will end `while` loop
thread.join()   # it will wait for end of thread

如果task时间不长,则可以使用after()代替线程和while循环。 类似于

def every(delay, task):
    start = time.time()

    try:
       task()
    except Exception:
       traceback.print_exc()

    end = time.time()
    diff = end - start
    after_time = max(0, delay - diff)

    if running:
        window.after(after_time, every, (1000, task)) # 1000ms=1s

#---------------------------------------------

running = True

window.every(1000, tick) # 1000ms=1s
window.mainloop()

running = False # it will end `while` loop

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM