首先,非常不推荐大家强行中止一个运行中的线程,很有可能导致上下文环境没有释放(如锁,文件等)造成严重的后果,但是有的需求它就是奇葩,就是让你不得不强行终止一个线程(恶心),下面给大家介绍几种方法。
第一种:通过lambda匿名函数传递终止标志
这里我补充一下作用域,lambda函数作为实参传递给了形参stop,传递的是函数的引用,lambda函数有单独的内部作用域,嵌套在do_work函数内,嵌套作用域中的变量只有在嵌套的函数被调用时才进行查找,所以能够通过外部控制stop_threads的值。
import threading
import time
def do_work(id, stop):
print("I am thread", id)
while True:
print("I am thread {} doing something".format(id))
if stop():
print(" Exiting loop.")
break
print("Thread {}, signing off".format(id))
def main():
stop_threads = False
workers = []
for id in range(0,3):
tmp = threading.Thread(target=do_work, args=(id, lambda: stop_threads))
workers.append(tmp)
tmp.start()
time.sleep(3)
print('main: done sleeping; time to stop the threads.')
stop_threads = True
for worker in workers:
worker.join()
print('Finis.')
if __name__ == '__main__':
main()
第二种,使用进程而不是线程。
其余的方案我个人不喜欢,所以大家可以自行Google,不一一介绍了