1. IO-Bound与CPU-Bound
- IO-Bound
IO-Bound指的是程序的运行效率受计算机IO能力的限制。在程序的运行过程中,我们可能经常需要使用到计算机IO,如文件的读写操作,网络拉取下载操作等等。在这些情况下,由于IO操作没有返回相应的结果,程序不得不中止并等待。
- CPU-Bound
CPU-Bound指的是计算机程序的运行效率主要受到CPU能力的限制。如解压缩,正则表达式搜索等等。
2.多进程,多线程,多协程的对比
- 三者之间存在明显的层级关系,进程最大,一个进程可以启动多个线程,而一个线程则可以启动多个协程。
- 只有多进程可以在多核CPU中进行运算;线程与协程因受限于单个进程中所以只能运行在单核CPU中。
- 资源消耗,多进程 > 多线程 > 多协程
- 多进程适合解决CPU-Bound问题;因为多进程可以在多核CPU中进行运算。
- 多线程与多协程适合解决IO-Bound问题;理论上多线程同样能够提升CPU的运行效率,但由于python中GIL
(全局解释器锁:其存在是为了规避多线程使用过程中可能出现的数据完整性与同步问题;基本功能是使得一个进程中某一时刻最多只有一个线程在运行)
的存在没有办法实现CPU加速,但由于其在使用IO的过程中会释放GIL,因此能够更高效地使用IO。
- 多协程概念较新,可以同时启动非常多个,但目前还只支持特定库。
3.如何进行选择?
- 一:任务性质判断:IO-Bound还是CPU-Bound?如果是CPU-Bound选择多进程(multiprocessing)
- 二:任务量是否巨大?是否有现成的协程库支持?复杂度是否能够接受?如果答案持否,选择多进程(threading);否则可以尝试使用多协程(asyncio)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)