进程池vs线程池
为什么要用“池”:
池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务
池子内什么时候装进程:并发的任务属于计算密集型
池子内什么时候装线程:并发的任务属于IO密集型
(
concurrent:并发的,一致的,同时发生的 Executor执行者
)
#进程池
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import time,os,random
def task(x):
print('%s 接客' %os.getpid())
time.sleep(random.randint(2,5))
return x**2
if __name__ == '__main__':
# p=ProcessPoolExecutor(3) # 不指定默认开启的进程数是cpu的核数
# print(os.cpu_count())查看CPU的核数
p=ProcessPoolExecutor(max_workers=2) # 默认开启的进程数是cpu的核数,也就是干活的人数
#简写成for循环模拟6个任务执行
for i in range(6):
p.submit(task,i) #submit只是负责往池子里面丢任务,刚开始2个人同时接客
#1.submit往里面丢任务干活的人就是你指定的ProcessPoolExecutor(2)后面的人数
#2.刚一造个进程池,立马给你预备2个人干活,无论你丢多少任务,干活的永远是那2个人(谁先完了腾出手再接下一个)
#线程池
def task(x):
print('%s is running'%x)
time.sleep(random.randint(2, 5))
# return x**2
if __name__ == '__main__':
# p=ProcessPoolExecutor(max_workers=2)
p=ThreadPoolExecutor(20) #默认不写开启的是CPU核数*5
for i in range(25):
p.submit(task,i)