进程池不能无限开,线程也是不能无限开
因此就诞生了池的概念
这个池里面放了一定的数量的进程数或者线程数
进程池的设置
import os
import time
from multiprocessing import Pool #开启进程池要倒入Pool函数
def task(i):
print(i)
time.sleep(1)
if __name__ == '__main__':
print(os.cpu_count()) # 查看CPU数量
start = time.time()
'''这个参数传的是CPU个数 +1,这个值不设置就是默认CPU个数+1'''
p = Pool(5) #实例化5个进程,一次只能执行5个进程
'''map是异步的'''
p.map(task,range(20)) #这个就是相当于进程里面的start,开启的进程总数数,这里两个参数,一个是要执行的函数,一个是可迭代的对象
p.close() #这个代表就是不能再往进程池里提交任务
p.join() #等待子进程执行完毕
end = time.time()
print(start-end)
开启多进程的两种方式以及效率对比
def task(i):
print(1)
if __name__ == '__main__':
print(os.cpu_count()) # 查看CPU数量
start = time.time()
'''这个参数传的是CPU个数 +1,这个值不设置就是默认CPU个数+1'''
p = Pool(5) #定义进程池的数量,一次同时只能执行5个进程
'''map是异步的'''
p.map(task,range(20)) #这个就是相当于进程里面的start,开启的进程总数数,这里两个参数,一个是要执行的函数,一个是可迭代的对象
p.close() #这个代表就是不能再往进程池里提交任务
p.join() #等待子进程执行完毕
end = time.time()
print(end - start)
start = time.time()
p_l = []
for i in range(20):
p = Process(target=task,args=(i,))
p_l.append(p)
p.start()
for p in p_l:
p.join()
print(time.time() -start)
PS:进程池开启子进程任务的执行效率要高于for循环开启子进程的效率,因为进程池是根据CPU的数量+1来指定同时进程的数量,而for循环的底层原理是一次一次开启,所以效率没有进程池高
进程池了解知识
进程池apply方法
apply方法
import os
import random
import time
from multiprocessing import Pool
def task(i):
i += 1
print(i)
time.sleep(random.randint(1,3)) #用这个就可以看到是同步执行的
if __name__ == '__main__':
print(os.cpu_count()) # 查看CPU数量
start = time.time()
p = Pool(5)
'''apply是同步的,并不是异步的,所以效率并不会很高'''
for i in range(20):
'''apply里面有两个参数,一个是funcname(执行的函数名),一个是迭代对象'''
p.apply(task,args=(i,)) #这个就是同步的
end = time.time()
print(end - start)
apply_async方法
import os
import random
import time
from multiprocessing import Pool
def task(i):
i += 1
print(i)
time.sleep(random.randint(1,3))
if __name__ == '__main__':
start = time.time()
p = Pool(5)
res_l = []
'''apply_async是异步的'''
for i in range(20):
res = p.apply_async(task,args=(i,)) #这个方法就是把执行的结果值放入队列
res_l.append(res) #把值放入列表
for res in res_l: #for循环加get取值
res.get()
end = time.time()
print(end - start)