2

我创建了一个 python 线程。通过调用它的 start() 方法来运行它很有趣,我监视线程内部的一个 falg,如果该标志 == True,我知道用户不再希望线程继续运行,所以我想做一些房屋清洁并终止线程。

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

这是我的线程的样子。

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

编辑 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)            
4

2 回答 2

3

这里有几个问题,也可能是其他问题,但是如果您没有显示整个程序或特定异常,这是我能做的最好的:

  1. 线程应该执行的任务应该被称为“运行”或传递给线程构造函数。
  2. 线程本身不会调用join(),启动线程的父进程调用join(),这使得父进程阻塞,直到线程返回。
  3. 通常父进程应该调用run()。
  4. 一旦完成(从)run() 函数返回,线程就完成了。

简单的例子:

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
于 2012-09-29T01:12:02.240 回答
0

没有明确的方法可以从对线程实例的引用或从线程模块中杀死线程。

话虽如此,运行多个线程的常见用例确实提供了防止它们无限期运行的机会。例如,如果您正在通过urllib2连接到外部资源,则始终可以指定超时:

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

套接字也是如此:

import socket
socket.setdefaulttimeout(timeout)

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

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

于 2012-09-29T07:42:05.057 回答