python学习笔记(34)线程池&进程池
线程池
安装线程池模块
pip install threadpool
线程池在系统启动时即创建大量空闲的线程,程序只要将一个函数提交给线程池,线程池就会启动一个空闲的线程来执行它。当该函数执行结束后,该线程并不会死亡,而是再次返回到线程池中变成空闲状态,等待执行下一个函数。
此外,使用线程池可以有效地控制系统中并发线程的数量。当系统中包含有大量的并发线程时,会导致系统性能急剧下降,甚至导致 Python 解释器崩溃,而线程池的最大线程数参数可以控制系统中并发线程的数量不超过此数。
使用线程池下载图片例子:
1 import threadpool 2 3 import requests,hashlib 4 5 def down_load_pics(url): 6 req = requests.get(url) 7 title = hashlib.md5(url.encode()) 8 with open(title.hexdigest()+'.png','wb') as fw: 9 fw.write(req.content) 10 11 url_list = ['https://q4.qlogo.cn/g?b=qq&nk=1345741814&s=140', 12 'https://q4.qlogo.cn/g?b=qq&nk=1134900814&s=140', 13 'https://q4.qlogo.cn/g?b=qq&nk=511402865&s=140' 14 ] 15 pool = threadpool.ThreadPool(20)#创建一个最多20个线程的线程池 16 reqs = threadpool.makeRequests(down_load_pics,url_list)#创建要开启的多线程函数,返回list 17 # for req in reqs: #将所有要运行多线程的请求扔进线程池,写法1 18 # pool.putRequest(req) 19 [pool.putRequest(req) for req in reqs]#写法2 20 pool.wait()#等待所有线程完成后退出,必须得写wait,不然没有数据 21 print('end') #验证程序执行完毕
进程池
还可以使用进程池来快速启动几个进程,使用进程池的好处的就是他会自动管理进程数,咱们只需要给他设置一个最大的数就ok了。有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;
但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。
1 from multiprocessing import Pool 2 import os 3 4 5 def worker(msg): 6 print("%s开始执行,进程号为%d" % (msg,os.getpid())) 7 8 if __name__ == '__main__': 9 10 po = Pool(3) # 定义一个进程池,最大进程数3 11 for i in range(0, 10): 12 # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,)) 13 # 每次循环将会用空闲出来的子进程去调用目标 14 po.apply_async(func=worker,args=(i,)) 15 #第一个func参数指定运行的函数,第二个args是参数,没有参数可以不写 16 print("----start----") 17 po.close() # 关闭进程池,关闭后po不再接收新的请求 18 po.join() # 等待po中所有子进程执行完成,必须放在close语句之后 19 print("-----end-----")
进程池转载自:http://www.nnzhp.cn/archives/135