Python中如何使用线程池和进程池?
进程池的使用
为什么要有进程池?进程池的概念。
在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务。
那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗时间,销毁进程也需要消耗时间。
第二即便开启了成千上万的进程,操作系统也不能让他们同时执行,这样反而会影响程序的效率。
因此我们不能无限制的根据任务开启或者结束进程。那么我们要怎么做呢?
在这里,要给大家介绍一个进程池的概念,定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,
等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务。如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,
拿到空闲进程才能继续执行。也就是说,池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行。这样不会增加操作系统的调度难度,还节省了开闭进程的时间,也一定程度上能够实现并发效果。
from multiprocessing import Pool from multiprocessing import Process import time import os def func(n): print("子进程开始: %s"%n, os.getpid()) time.sleep(1) print("子进程结束: %s" % n, os.getpid()) if __name__ == "__main__": # 开启了5个进程 pool = Pool(5) for i in range(10): # 正常情况下先执行5个start 后执行5个end p = Process(target=func,args=(i,)) p.start()
线程池的使用
import time from concurrent.futures import ThreadPoolExecutor def func(n): print(n) time.sleep(1) return n * 10 t_lst = [] # 定义一个线程池(默认 不要超过cup个数*5) tpool = ThreadPoolExecutor(max_workers=5) for i in range(20): # 传值(开启20个子线程) t = tpool.submit(func, i) t_lst.append(t) # 相当于 close + join tpool.shutdown() print("主线程") for t in t_lst: # t.result() 接受返回值 print("\033[31m ==== \033[0m", t.result())