进程池:用于确定同一时间有多少个进程在CPU上运行。本实例创建10个进程,每次就启用5个,就是5个5个的打印。

进程池用法:

1. 创建 mypool = Pool(5)

2. 调用 mypool.apply_async(func=Foo, args=(i,), callback=Bar)

3. 关闭 mypool.close()

4. 阻塞等待 mypool.join() 一定要在最后这加上,否则就不执行了,我也不知道为什么。

在 windows下启动多进程,一定要加上freeze_support()  MAC linux不需要。

from multiprocessing import Process, Pool,freeze_support
import time
import os

def Foo(i):
    time.sleep(2)
    print("in process foo",os.getpid())
    return i + 100

#此回调函数用于数据库备份场景 父进程里直接写数据库
#                          不需要每个子进程都连一次数据库
def Bar(arg):
    print("-->exec done:", arg)

def mypool():
   freeze_support()                                # windows启动时必备  如果是直接调用则执行,如果是作为模块被调用,则不执行
   mypool = Pool(5)                                  #1.创建进程池 允许同时放入5个进程
   for i in range(10):
      mypool.apply_async(func=Foo, args=(i,), callback=Bar) #2.应用到进程里 callback 执行完foo 后调用Bar
    # mypool.apply(func=Foo, args=(i,))
    #mypool.apply_async(func=Foo, args=(i,))

   print('end')
   mypool.close()   #先close() 后join()
   mypool.join()    # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。

#主程序的入口 手动时会执行,模块导入时不会执行
if __name__ == '__main__':
       mypool()