当需要很多进程时,把进程全部创建需要消耗很多资源,进程池的就是把创建的进程循环利用
from multiprocessing.pool import Pool
import time
import os
def fun():
time.sleep(2)
print(1)
print(os.getpid())
if __name__ == '__main__':
p = Pool(3) # 默认进程数为cpu核数
for i in range(10):
# p.apply_async(fun,args=(i,)) # 异步非堵塞,args(i,)是向fun()传递参数
p.apply_async(fun) # 异步非堵塞
# p.apply(fun) # 堵塞
p.close() # 关闭进程池
p.join() # 等待子进程执行结束,再往后执行,没有这句会直接打印 end,不会执行fun函数
print('end')
print(os.getpid()) # 主进程号和进程池中的子进程号不一样
当使用异步非堵塞apply_async时:
from multiprocessing.pool import Pool
import time
import os
def fun(a):
time.sleep(2)
print(a)
print(os.getpid())
if __name__ == '__main__':
p = Pool(3) # 默认进程数为cpu核数
for i in range(10):
p.apply_async(fun,args=(i,)) # 异步非堵塞,args(i,)是向fun()传递参数
# p.apply_async(fun) # 异步非堵塞
# p.apply(fun,args=(i,)) # 堵塞
p.close() # 关闭进程池
p.join() # 等待子进程执行结束,再往后执行,没有这句会直接打印 end,不会执行fun函数
print('end')
有join()的执行结果
---------------------------------------分割线-----------------------------------------
from multiprocessing.pool import Pool
import time
import os
def fun(a):
time.sleep(2)
print(a)
print(os.getpid())
if __name__ == '__main__':
p = Pool(3) # 默认进程数为cpu核数
for i in range(10):
p.apply_async(fun,args=(i,)) # 异步非堵塞,args(i,)是向fun()传递参数
# p.apply_async(fun) # 异步非堵塞
# p.apply(fun,args=(i,)) # 堵塞
p.close() # 关闭进程池
# p.join() # 等待子进程执行结束,再往后执行,没有这句会直接打印 end,不会执行fun函数
print('end')
没有join()的执行结果
---------------------------------------分割线-----------------------------------------
堵塞apply
from multiprocessing.pool import Pool
import time
import os
def fun(a):
time.sleep(2)
print(a)
print(os.getpid())
if __name__ == '__main__':
p = Pool(3) # 默认进程数为cpu核数
for i in range(10):
# p.apply_async(fun,args=(i,)) # 异步非堵塞,args(i,)是向fun()传递参数
# p.apply_async(fun) # 异步非堵塞
p.apply(fun,args=(i,)) # 堵塞
p.close() # 关闭进程池
# p.join() # 等待子进程执行结束,再往后执行,没有这句会直接打印 end,不会执行fun函数
print('end')
当使用堵塞apply时的执行结果