笔记day3进程池

来源:互联网 发布:熊猫书院 知乎 编辑:程序博客网 时间:2024/06/10 03:06
进程池

什么是进程池
   预先创建一组子进程,当有新任务来时,主进程通过某种方法分派给该组进程中的一个进程完成此任务,这种成组管理子进程的模式与实现称为进程池

为什么用进程池
进程创建,销毁需要CPU的时间开销
预先创建,以空间换时间,提供性能
通过合理分配任务提高性能
Pool 类
python进程池实现,Pool类

管理一个包含工作进程的进程池
支持同步,异步,映射方式添加任务到进程池
方便对多个函数或分布式数据并行执行和运算

注意:必须有一个__main__模块导入
   进程池对象的方法只能由创建进程池的进程调用
进程池
     fork 父进程不会等子进程,父子程都要做事情
     Process 父进程等待子进程,父子进程都有事情
     Pool    父进程等待子进程,父进程不做事
历程
p = Pool()
p.apply_async() p.map()
p.close()
p.join()

apply不要用,会堵塞,可能比单进程还要慢

代码

# /***************进程池的时间与单进程比较******************************/import multiprocessingimport timedef func(msg):    sum = 0    for x in range(msg):        sum += x * x    return sumif __name__ == "__main__":    calCount = 10000    checkNum = 1001    # 用进程池算平方和,看看计算时间    t1 = time.time()    pool = multiprocessing.Pool(processes=2)    result = pool.map(func, range(calCount))  # 计算到9999平方和    pool.close()    pool.join()    print(result[checkNum])    print('进程池时间 %f' % (time.time() - t1))    # 用一个单进程比较时间    t2 = time.time()    result2 = []    for x in range(calCount):        result2.append(func(x))    print(result[checkNum])    print('主线程用时间 %f' % (time.time() - t2))
运行结果

333833500进程池时间 4.888444333833500主线程用时间 4.338528


apply堵塞现象

# /****************apply**********************************/from multiprocessing import Poolimport timedef func(str):    print("Pool:", str)    time.sleep(1)    print("Pool:", str, "end")if __name__ == "__main__":    p = Pool(processes=3)    time1 = time.time()    for i in range(4):        msg = "apply %d" % (i)        p.apply(func, (msg, ))    print("for end")    p.close()    p.join()    print("Main end")    print(time.time() - time1)

运行结果

Pool: apply 0Pool: apply 0 endPool: apply 1Pool: apply 1 endPool: apply 2Pool: apply 2 endPool: apply 3Pool: apply 3 endfor endMain end4.112452983856201

apply_asyns 进程池

# /************************进程池*************************/# coding: utf-8import multiprocessingimport timedef func(msg):    print("msg:", msg)    time.sleep(1)    print("end")if __name__ == "__main__":    pool = multiprocessing.Pool(processes=3)    t1 = time.time()    for i in range(4):        msg = "hello %d" % (i)        # 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去        pool.apply_async(func, (msg, ))    print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")    pool.close()    pool.join()  # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束    print("用时:%f" % (time.time() - t1))
运行结果

Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~msg: hello 0msg: hello 1msg: hello 2endmsg: hello 3endendend用时:2.095648


代码中的pool.apply_async()apply()函数的变体,apply_async()apply()的并行版本,apply()apply_async()的阻塞版本,使用apply()主进程会被阻塞直到函数执行结束,所以说是阻塞版本。apply()既是Pool的方法,也是Python内置的函数,两者等价。
原创粉丝点击