根据标志终止python线程

时间:2012-09-29 00:44:33

标签: python multithreading

我创建了一个python thread.One通过调用它的start()方法来运行,我监视线程内的falg,如果那个标志== True,我知道用户不再希望线程继续运行,所以我懒得做房子清洁并终止线程。

但是我无法终止该线程。我试过thread.join(),thread.exit(),thread.quit(),都抛出异常。

这是我的线程的样子。

编辑1:请注意在标准run()函数中调用core()函数,我在这里没有显示它。

编辑2:当StopFlag为true时我刚刚尝试了sys.exit(),看起来线程终止了!可以安全使用吗?

class  workingThread(Thread):

    def __init__(self, gui, testCase):
        Thread.__init__(self)
        self.myName = Thread.getName(self)
        self.start()    # start the thread

    def core(self,arg,f) : # Where I check the flag and run the actual code

        # STOP
        if (self.StopFlag == True):
            if self.isAlive():

                self.doHouseCleaning()
                # none of following works all throw exceptions    
                self.exit()
                self.join()
                self._Thread__stop()
                self._Thread_delete()
                self.quit()

            # Check if it's terminated or not
            if not(self.isAlive()):
               print self.myName + " terminated " 



        # PAUSE                                                        
        elif (self.StopFlag == False) and not(self.isSet()):

            print self.myName + " paused"

            while not(self.isSet()):
                pass

        # RUN
        elif (self.StopFlag == False) and self.isSet():
            r = f(arg)            

2 个答案:

答案 0 :(得分:3)

这里有几个问题,也可能是其他问题,但如果你没有展示整个程序或特定的例外,这是我能做的最好的事情:

  1. 线程应该执行的任务应该被称为“run”或传递给Thread构造函数。
  2. 一个线程本身不调用join(),启动线程的父进程调用join(),这使得父进程阻塞直到线程返回。
  3. 通常父进程应该调用run()。
  4. 线程在完成(返回)run()函数后完成。
  5. 简单示例:

    import threading
    import time
    
    class MyThread(threading.Thread):
    
        def __init__(self):
            super(MyThread,self).__init__()
            self.count = 5
    
        def run(self):
            while self.count:
                print("I'm running for %i more seconds" % self.count)
                time.sleep(1)
                self.count -= 1
    
    t = MyThread()
    print("Starting %s" % t)
    t.start()
    # do whatever you need to do while the other thread is running
    t.join()
    print("%s finished" % t)
    

    输出:

    Starting <MyThread(Thread-1, initial)>
    I'm running for 5 more seconds
    I'm running for 4 more seconds
    I'm running for 3 more seconds
    I'm running for 2 more seconds
    I'm running for 1 more seconds
    <MyThread(Thread-1, stopped 6712)> finished
    

答案 1 :(得分:0)

没有明确的方法来杀死线程,无论是从对线程实例的引用还是从线程模块的引用。

话虽这么说,运行多个线程的常见用例确实有机会阻止它们无限期地运行。例如,如果您通过urllib2与外部资源建立连接,则可以始终指定超时:

import urllib2
urllib2.urlopen(url[, data][, timeout])

套接字也是如此:

import socket
socket.setdefaulttimeout(timeout)

请注意,调用指定超时的线程的join([timeout])方法只会阻塞hte超时(或直到线程终止。它不会终止该线程。

如果要确保线程在程序完成时终止,只需确保在调用它的start()方法之前将线程对象的守护进程属性设置为True。