进程池:
每一个进程在启动一个子进程时都会克隆一分数据,并开启额外一份内存空间,如果多次开启子进程,对内存的开销比较大,这里可以通过进程池来控制进程的最大个数,来解决。
进程池中有两个方法:
- apply #串行
- apply_async #并行
回调callback:
可以启动10台机器批量进行数据库备份,每个进程执行完毕后在数据库内写入一条日志,可以使用回调写入,回调是由主进程执行的,所以只进行一次链接就可以并发帮子进程写入日志,而不需要进行重复的链接。
# windows下的多进程参数 # from multiprocessing import freeze_support from multiprocessing import Pool import time,os def Foo(i): time.sleep(2) print("in process",os.getpid()) return i+100 def Bar(arg): print('-->exec done:',arg,os.getpid()) # 判断是直接执行这个脚本,就成立 # 如果是其他文件调用这个脚本就不执行 if __name__ == '__main__': # 允许进程池同时放入吴哥进程 # cpu只会计算这5个,其他进程处于挂起状态 pool = Pool(processes=5) for i in range(10): # 并行执行程序 # callback=回调 执行玩func在回掉callback # 主进程进行回调 pool.apply_async(func=Foo, args=(i,),callback=Bar) # 串行执行进程 #pool.apply(func=Foo, args=(i,)) print('end') # 关闭pool pool.close() # 注:并行执行时,先close在join。 # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。 pool.join()