start_new_thread后加入线程

RAF*_*FIQ 5 python multithreading join

当我单独运行下面的函数时,它会在 3 秒后退出,但是当我在线程中调用它时,它永远不会退出。请建议这段代码有什么问题。

def display(val1, val2):

    root =  Tk()
    clock = Label(root, font=('times', 20, 'bold'), bg='white')
    clock.pack(fill=BOTH, expand=0)
    def tick():
        time1 = val1 +'\n' + val2
        clock.config(text=time1)
    tick()
    root.after(3000,root.quit)
    root.mainloop()
Run Code Online (Sandbox Code Playgroud)

我在程序中调用上面的函数

thread.start_new_thread(display,(val1,val2))
Run Code Online (Sandbox Code Playgroud)

线程正常启动,主程序继续,但显示功能在3秒后没有退出,请建议如何加入该线程或销毁它而不影响主程序

Gar*_*tty 2

编辑:

在我的测试中,我认为您的实际问题在于 tkinter。你想要Tk.destroy()Tk.quit()

from tkinter import * # < Python3.x you will need Tkinter not tkinter.
from threading import Thread

def display(val1, val2):
    root =  Tk()
    clock = Label(root, font=('times', 20, 'bold'), bg='white')
    clock.pack(fill=BOTH, expand=0)
    def tick():
        time1 = val1 +'\n' + val2
        clock.config(text=time1)
    tick()
    root.after(3000, root.destroy)
    root.mainloop()

thread = Thread(target=display, args=("1", "2"))
thread.start()
Run Code Online (Sandbox Code Playgroud)

这对我有用。

从以前:

您应该查看更高级别的threading模块。这是一个更好的选择。

要加入线程:

from threading import Thread
...
thread = Thread(target=display, args=(val1, val2))
thread.start()
...
thread.join()
Run Code Online (Sandbox Code Playgroud)

对此的替代方案是multiprocessing模块。

from multiprocessing import Process
...
process = Process(target=display, args=(val1, val2))
process.start()
...
process.join()
Run Code Online (Sandbox Code Playgroud)

threadingor不同的是threadmultiprocessingoffer Process.terminate()