Python中线程与协程的区别:1、多核CPUU可以在python中使用一个线程;2、线程是同步机制,协程是异步;3、 协程可以保持上次调用的状态,每次重新进入过程,相当于进入上次调用的状态。
首先,让我们了解一下线程和协程的概念
1、线程
线程是过程的实体,是CPU调度和分配的基本单位,是比过程小的基本单位。线程本身基本上没有系统资源,只有一点运行中必不可少的资源(如程序计数器、一组寄存器和堆栈),但它可以与同一过程中的其他线程共享过程中的所有资源。线程间通信主要通过共享内存,上下文切换快,资源成本低,但与过程相比不够稳定,容易丢失数据。
2、协程
协程是用户状态的轻量级线程,协程的调度完全由用户控制。协程有自己的寄存器上下文和堆栈。协程调度切换时,将寄存器上下文和堆栈保存到其他地方。切割时,恢复以前保存的寄存器上下文和堆栈。直接操作堆栈基本上没有核心切换成本,可以不锁定地访问全局变量,因此上下文切换非常快。
二、协程与线程的比较
1) 一个线程可以有多个协程,一个过程也可以单独有多个协程,这样多核CPU就可以用于Python。
2) 线程过程是同步机制,而协程是异步。
3)协程可以保持上次调用的状态,每次重新进入过程,相当于进入上次调用的状态。
三、python中使用的线程和协程
1、多线程通常使用threading库来完成一些IO密集并发操作。多线程的优点是切换快,资源消耗低,但挂断一个线程会影响所有线程,因此不够稳定。实际上,使用线程池的场景会更多。详见python线程池实现情况。
2、协程通常使用gevent库。当然,这个数据库使用起来很麻烦,所以使用不多。相反,协程在tornado中的应用要多得多。使用协程使tornado实现单线程异步,据说可以解决C10K的问题。因此,协程最常用于web应用。
总结一下:
IO密集型一般采用多线程或多流程,CPU密集型一般采用多流程,强调非阻塞异步并发通常采用协程,当然,有时需要多流程线程池组合,或其他组合方法。
推荐课程:Python高级视频教程