什么是协程吗?和线程有什么区别?

协程(Coroutine)是一种用户级别的轻量级线程。它们的调度完全由用户控制,而不是由操作系统内核控制。与线程不同,协程的上下文切换极其快速且成本低,主要因为它所需保存和恢复的状态较少。

对于协程和线程的比较,参考以下四个方面:

  1. 切换开销:线程由系统内核控制,切换开销大;协程由程序员在用户空间控制,切换开销小。

  2. 调度:线程是抢占式调度,需要操作系统来进行线程的调度切换;协程是非抢占式的,由协程自身决定何时进行切换,这也是其使用复杂性的来源之一。

  3. 数据共享和同步:线程并发编程需要考虑锁等同步机制的问题;而协程在同一时间只有一个运行,它对共享资源的访问不需要加锁,只需要确保在协程切换的时候保存好共享资源的状态即可。

  4. 应用场景:线程适合cpu密集型任务; 协程适合IO密集型任务。

以Python为例,其中有个名为greenlet的第三方库就为我们提供了协程的支持。在网络请求处理的场景中,由于网络IO等待时间较长,使用线程处理可能会导致大量的线程阻塞在等待 I/O,而协程可以在等待IO的时候主动让出CPU让其他协程执行,然后在恢复等待的协程,在每一次IO等待的时候都可以主动让出CPU让其他协程利用,这样就可以充分利用CPU,提高执行效率。

发表评论

后才能评论