背景:
多线程跑系统识别,当某线程得到结果后,需要优雅的停止平行的其他线程,结束本次任务。
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()