在对python的多线程与多进程讨论之前,我先提出一个论点,即一个矛盾点,使用python编程,不论你选择多线程还是多进程都是不合适的,当然,此处的“不合适”也公限于相对而言
因为本文有多处引用这位老兄的文档,所以我在这先把他的文章链接给出: https://blog.csdn.net/youanyyou/article/details/78990156 而且先明白一个真理,也是一个常识,CPU的处理速度比I/O的处理速度快的多的多,不是同一个数量级的
1、什么是CPU密集型?多进程为什么适合于用于CPU密集型程序?python的多进程局限性?
先来回答第一个问题:
我再稍作重点解释,1)CPU 负载达到 100%,2)I/O操作时间短,
有的人会问 CPU负载到 100%是不是就是满载了,不能再高了,答案:不是, 其实这个负载100%其实也是相对的,在1分钟内是100%,在2分钟内可能就不是100%了,后面的计算程序还可以排队,这里的就是CPU没有空闲的意思
I/O操作时间短,打一个比喻,一个文件出数据库取出,非常快,但是这些数据要计算啊!到了CPU这儿,就卡住了,因为一看,前面还有文件在排队,还是排着吧!
第二个问题:
经过前面的解释,我相信你看到这儿已经明白为什么多进程适合于CPU密集型,当然如果你还不明白,可能需要一个提示,什么是进程,什么是多进程,计算机资源分配就是以进程为单元,如果单个数据计算都完不成,那还需要任务干吗?再多的任务也要等待
第三个问题:
python 多进程的局限性,作为一个以python为主要工作语言的我不得不承认,也正是由于这个特点,导致了这个局限性,python 慢,本来就是为了处理一个计算性的程序,要求的就是快,但使用这么慢的语言,确实是一个鸡肋,为什么是鸡肋呢,python编程快啊!
2、什么是i/o密集型?多线程为什么适合于用于i/o密集型程序?python的多线程局限性?
如果一个程序执行主要是依靠网络、磁盘开销,而没有过多的计算,则是I/O密集型,
由于CPU的速度远大于i/o操作的速度,线程的操作实际是一个计算过程,即同一个CPU中进行的,所以这个操作适合于线程,
python的多线程由于GIL(全局解释性锁)的存在,其实是在一个线程中执行的,只不过是CPU的切换速度非常快,所以可默认为是多线程