笔记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_asyns 进程池
代码中的
什么是进程池
预先创建一组子进程,当有新任务来时,主进程通过某种方法分派给该组进程中的一个进程完成此任务,这种成组管理子进程的模式与实现称为进程池
为什么用进程池
进程创建,销毁需要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内置的函数,两者等价。 阅读全文
0 0
- 笔记day3进程池
- day3-笔记
- java学习笔记day3
- CCNA学习笔记Day3
- day3随堂笔记
- C#基础笔记 Day3
- 学习笔记day3
- Android学习笔记day3
- Paython笔记Day3
- DAY3学习笔记
- DAY3视频学习笔记
- 计算机网络学习笔记day3
- linux学习笔记-day3
- HTML学习笔记(Day3)
- CSS学习笔记(Day3)
- js复习笔记day3
- 郑州集训DAY3笔记
- Python笔记Day3
- sameersbn/gitlab/latest(10/16版本)配置坑点记录
- System类_Calendar类_Date类_小记
- 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
- Imageloader基本使用(显示图片设置)
- docker 容器后台运行
- 笔记day3进程池
- uboot控制台下的环境变量详解
- 如何理解最大似然估计?
- MyEclipse快捷键大全
- Java多线程编程——线程间通信
- 我对于卡精度的认识
- 多线程
- Android Studio(for mac) adb 命令command not found
- 内部类