Python 进程池

进程池:
  每一个进程在启动一个子进程时都会克隆一分数据,并开启额外一份内存空间,如果多次开启子进程,对内存的开销比较大,这里可以通过进程池来控制进程的最大个数,来解决。
 
进程池中有两个方法:
  • 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()

 

 
posted @ 2018-01-04 17:25  kevin.Xiang  阅读(351)  评论(0编辑  收藏  举报