多线程与多进程!
进程、线程和协程的区别
进程:充分利用多CPU
线程:充分利用多核(达到真正的多任务并行)
协程:充分利用单核(充分挖掘不断提高性能的单核CPU的潜力。类比事件驱动和异步程序)。既可以利用异步优势,又可以避免反复系统调用,还有进程切换造成的开销。
协程存在的意义:
对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。协程能保留上一次调用时的状态,不需要像线程一样用回调函数,所以性能上会有提升。
缺点:本质是个单线程,不能利用到单个CPU的多个核。
线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。
切换开销(即调度和切换的时间):进程 > 线程 > 协程
进程和线程的区别:
关键词:cpu,io密集型计算概念
概要:
计算密集型 (CPU-bound)(适合多进程,而多线程是鸡肋)和I/O密集型 (CPU-bound) (适合配置多线程,充分利用CPU资源)
应用区别(上面PS中具体提到的):
计算密集型程序适合C语言多线程
I/O密集型适合脚本语言开发的多线程。
内容:
CPU密集型(根据实际的发生场景,也可以叫它计算密集型)的程序,如涉及到大量的计算(如计算圆周率、对视频进行高清解码),这种任务主要消耗CPU资源,本身不太需要访问I/O设备,所以多线程是鸡肋,因为线程切换也是要耗时的。
(PS:Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写。)
I/O 密集型的的程序(如网络、磁盘IO)一般在达到性能极限时,CPU占用率仍然较低。
它的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)
因为任务本身需要大量I/O操作,此时用多线程,能充分利用CPU资源。因为I/O操作时,程序会有很多等待的机会,此时系统会切换到其他线程,把等待的时间利用上。
对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。
(PS:对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。)
常见的大部分任务都是IO密集型任务,比如Web应用。
应用区别(上面PS中具体提到的):
计算密集型程序适合C语言多线程
I/O密集型适合脚本语言开发的多线程。