python关于线程的一点问题?以及如何合适的结束线程?

目的

我写了一个Tkinter,按下按钮后执行事件,按下结束按钮停止事件。所以我想到了线程来做这件事,但是在python的线程当中遇到的一个问题就是:按下结束后,线程并没有完全结束。例如下述代码所示

class ControlThread(threading.Thread):
    #任务控制线程,每次点击开始按钮创建一个新的线程
    def __init__(self):
        self._stop_event = threading.Event()
        threading.Thread.__init__(self)
    def run(self):
        while not self.stopped():
            print("hello world")
            time.sleep(1)
            print("hello world2")
            time.sleep(1)
            print("hello world3")
            time.sleep(1)
     def terminate(self):
        #标志位设置为False,停止线程
        self._stop_event.set()

    def stopped(self):
        #返回当前线程是否停止
        return self._stop_event.is_set()

每三秒会输出上面的三条字符串,如果我让他运行10秒,我的目的是让他输出10条语句就结束,

    aa.start()
    time.sleep(10)
    aa.terminate()

但是运行后输出了了12条数据,也就是说设置Event()并不能很好的结束,后面专用Multiprocessing process,可以达到目的,但是在Tkinter中创建多个进程会报错。

请问如何在python中能达到我这样的目的?

阅读 3.3k
2 个回答

你每间隔 3 秒才检查一次,当然会有问题。检测频繁一点就可以了。

import threading
import time

class ControlThread(threading.Thread):
    #任务控制线程,每次点击开始按钮创建一个新的线程
    def __init__(self):
        self._stop_event = threading.Event()
        threading.Thread.__init__(self)
    def run(self):
        count = 1
        while not self.stopped():
            time.sleep(1)
            print("hello world: ", count)
            count += 1

    def terminate(self):
        #标志位设置为False,停止线程
        self._stop_event.set()

    def stopped(self):
        #返回当前线程是否停止
        return self._stop_event.is_set()

aa = ControlThread()
aa.start()
time.sleep(10)
aa.terminate()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题