背景:

多线程跑系统识别,当某线程得到结果后,需要优雅的停止平行的其他线程,结束本次任务。

Python threading模块不同于其它语言之处在于它没有提供线程的终止方法,而且python的多线程设计本身也是不希望用户这么做,但是很多时候我们得到某个结果后为了节省不必要的资源 必须停止其他线程的工作。

其实如果如果想要实现这个功能很简单,我们可以自己定义一个全局变量,在每次任务循环中判断这个变量的状态,如果某个线程中得到结果,那么改变变量,其他线程得知这个变量改变后break即可。

python已经有这么一个功能,叫event,原理和上述一样,只是对一个状态做了一个标记。

1.设置信号

使用Event的set()方法可以设置Event对象内部的信号标志为真。Event对象提供了isSet()方法来判断其内部信号标志的状态,当使用event对象的set()方法后,isSet()方法返回真.

2.清除信号

使用Event对象的clear()方法可以清除Event对象内部的信号标志,即将其设为假,当使用Event的clear方法后,isSet()方法返回假

3.等待

Event对象wait的方法只有在内部信号为真的时候才会很快的执行并完成返回。当Event对象的内部信号标志位假时,则wait方法一直等待到其为真时才返回。

举个例子

class Thread_rec(threading.Thread):
	def __init__(self):
		#初始化一些变量
    def run(self):
        global event
        while True:
            if self.queue.empty():
                break
            one = self.queue.get()
            if event.isSet():#查到标志
                result = Celery_get('something')
            else:
                break
            if result:	#如果该进程得到结果
                print('exec something')
                event.clear()   #停止线程标记
                break
        return False
		
if __name__ == '__main__':
    event = threading.Event()
    event.set()