python程序的运行是由一个或者多个进程来进行执行的,但是具体的实现和内存的占用还是由进程内的线程去完成的。简单的说,一个进程由多个线程组成,不同的线程会完成不同的任务。
可以用threading.activeCount()来查看正在运行的线程数量。
1、设置一个退出标志flag:
一个比较好用的方式就是在每一个线程后面都加上一个退出的请求标志,表示在执行完成后就自动的退出,不再占用资源和内存。
在线程的run方法中可以根据这个标志位是为true还是为false来判断是否满足终止条件,这种情况多用于while循环中。
Threads = []
# 将会启动与搜索结果等量个线程,线程满足一定条件时则全部线程终止!
for i in range(0,len(self.g_results)):
t = threading.Thread(target=self.get_page,args=(i+1,))
t.daemon = 1
Threads.append(t)
# 启动所有线程
for i in Threads:
i.start()
# 当标志位【 flag 】时所有多线程结束
while 1:
if self.__flag:
break
或者
# 导入线程操作模块threading
import threading
# 定义一个函数在执行完毕后自动退出
def __init__(self):
super(this, self).__init__()
self._stop_event = threading.Event()
2、使用 stop() 方法强行终止线程
但是不推荐使用这个方法,因为使用此方法不安全,目前该方法已被弃用;
3、使用 interrupt()方法中断线程
断线程时并不会立即终止线程,而是通知目标线程,告诉它有人希望你终止。至于目标线程收到通知后会如何处理,则完全由目标线程自行决定。
4、异常处理停止
在python之中停止一个线程可以raise一个Exception,也就是是异常来停止线程。这个方法的缺点在于如果线程在解释器busy之外,那么就无法捕获异常。应该指定一个异常然后清理就能停止线程了,示例如下:
# 定义一个函数表示线程
def counts(flag):
# 进入函数就强制捕获异常来停止线程
if flag:
raise ValueError("数据错误")