[英]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.