`

协程与线程

 
阅读更多

Reference:https://time.geekbang.org/column/article/104521

 

协程的实现原理

协程不只在Go语言中实现了,其实目前大部分语言都实现了自己的一套协程,包括C#、erlang、python、lua、javascript、ruby等。

 

相对于协程,你可能对进程和线程更为熟悉。

进程一般代表一个应用服务,在一个应用服务中可以创建多个线程,

而协程与进程、线程的概念不一样,可以将协程看作是一个类函数或者一块函数中的代码,可以在一个主线程里面轻松创建多个协程。

 

程序调用协程与调用函数不一样的是,协程可以通过暂停或者阻塞的方式将协程的执行挂起,而其它协程可以继续执行。这里的挂起只是在程序中(用户态)的挂起,同时将代码执行权转让给其它协程使用,待获取执行权的协程执行完成之后,将从挂起点唤醒挂起的协程。 协程的挂起和唤醒是通过一个调度器来完成的。

 

相比线程,协程少了由于同步资源竞争带来的CPU上下文切换,I/O密集型的应用比较适合使用,特别是在网络请求中,有较多的时间在等待后端响应,协程可以保证线程不会阻塞在等待网络响应中,充分利用了多核多线程的能力。而对于CPU密集型的应用,由于在多数情况下CPU都比较繁忙,协程的优势就不是特别明显了。

 

总结

协程和线程密切相关,协程可以认为是运行在线程上的代码块,协程提供的挂起操作会使协程暂停执行,而不会导致线程阻塞。

 

协程又是一种轻量级资源,即使创建了上千个协程,对于系统来说也不是很大的负担,但如果在程序中创建上千个线程,那系统可真就压力山大了。可以说,协程的设计方式极大地提高了线程的使用率。

分享到:
评论

相关推荐

    协程与微线程demo

    **协程与微线程简介** 协程(Coroutines)和微线程(Microthreads)是计算机程序设计中的两种并发执行机制,它们在处理高并发和低延迟问题时展现出高效性能。协程是一种轻量级的线程,它允许在一个线程内暂停执行并...

    简述Python中的进程、线程、协程

    进程、线程和协程之间的关系和区别也困扰我一阵子了,最近有一些心得,写一下。 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程...

    java线程与协程效果对比

    本文将深入探讨Java中的线程与协程的效果对比,以及它们各自的特点和适用场景。 线程是操作系统提供的基本执行单元,每个线程都有自己的程序计数器、系统栈和局部变量。在Java中,线程可以通过实现`Runnable`接口或...

    C 协程库orchid.zip

    某种意义上,协程与线程的关系类似与线程与进程的关系,多个协程会在同一个线程的上下文之中运行。因此,当出现IO操作的时候,为了能够与协程相互配合,只阻塞当前协程而非整个线程,需要将io对象“green化”。目前...

    amareya java 协程

    协程与线程不同,它们不是由操作系统调度,而是由程序自身控制。这意味着协程的上下文切换可以在用户空间进行,减少了系统调用的开销,从而提高了效率。在Amareya库中,你可以创建一个协程,并通过一系列的协作操作...

    快速上手,协程剖析

    协程是计算机程序中的一种运行单元,它与线程和进程都是并发执行的基础结构,但它们之间有着本质的区别。协程通常也被称作微线程,其英文名称为coroutine。在操作系统和计算机科学中,进程和线程是资源分配的基本...

    深入浅出Unity协程.rar

    与线程不同,协程不会同时运行,它们是单线程的,但在同一时间片内可以有多个协程处于“活动”状态。Unity中的协程由`IEnumerator`接口定义,通过`yield`关键字来控制执行流程。一个协程可以理解为一个可暂停并能在...

    Python中协程用法代码详解

    Python中的协程是一种轻量级的并发机制,与线程相比,协程具有更低的开销和更高的效率,尤其适用于I/O密集型任务。本文将深入探讨Python协程的定义、与线程的区别、可能遇到的问题、优势以及如何通过`yield`和`...

    Go并发编程之协程及其调度机制

    本文将深入探讨协程的概念、与线程的区别以及Go中的goroutine实现。 ### 协程概念 协程最早由Melvin Conway在1963年的论文中提出。它是一种用户态的轻量级线程,允许在一个进程中并行执行多个逻辑流。协程拥有自己...

    操作系统相关的部分面试题

    协程与线程的区别? * 线程和进程都是同步机制,而协程是异步机制。 * 线程是抢占式,而协程是非抢占式的。需要用户释放使用权切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。 * ...

    coroutine_event.zip

    在某种意义上,协程与线程的关系类似于线程与进程的关系,你可以将协程理解成用户态线程。目前的IO操作都可能会导致整个线程的挂起,但是我们只希望挂起当前执行的协程,因此需要将IO对象进行改造,让其只会导致挂起...

    微信的技术实现——libco协程设计及实现.docx

    - **低开销**:协程间的切换开销远低于线程切换,因为它们共享相同的线程上下文,无需进行用户态与内核态之间的切换。 - **资源占用少**:相比于线程,协程的栈空间占用更小,通常仅为128K,从而节省了大量的内存...

    多协程、多线程、多进程代码

    在Python编程中,多协程、多线程和多进程是实现并发执行任务的重要机制,它们可以帮助我们提高程序的执行效率,充分利用系统资源。本文将深入探讨这些概念以及它们在Python中的实现方式。 首先,我们要了解并发的...

    深入浅析python 协程与go协程的区别

    【深入浅析Python协程与Go协程的区别】 在计算机科学中,进程、线程和协程是并发执行任务的三种基本方式。进程是程序在操作系统中的实例,包含内存空间和资源;线程是进程中的执行单元,是CPU调度的基本单位,同一...

    c++ libgo 多协程ppt

    而协程,作为轻量级的执行单元,可以在单线程中实现高效的并发,减少了线程创建和上下文切换的成本。 协程并非由操作系统内核管理,而是由程序自身控制,因此被称为“用户态的线程”。它们可以在单线程中自动切换,...

    python并发编程之多进程、多线程、异步和协程详解

    协程与线程的最大区别在于调度方式。线程是抢占式的,而协程是协作式的。这意味着协程在执行过程中可以主动让出控制权,然后在合适的时候恢复执行,而不是被操作系统强制切换。Python中的生成器(Generators)可以...

    Coroutines,承办单位.zip

    协程与线程不同,它们是轻量级的执行单元,可以在运行时暂停和恢复,这使得它们在处理异步操作时特别高效。这个名为"Coroutines,承办单位.zip"的压缩包可能是一个开源项目,专注于实现或演示协程的使用。 “小精灵...

    02进程、线程与协程.zip

    在计算机科学中,进程、线程和协程是操作系统中执行任务的基本单元,它们对于理解和优化软件性能至关重要。下面将详细解释这些概念及其相互关系。 首先,我们来谈谈"进程"。进程是操作系统中运行的一个应用程序实例...

Global site tag (gtag.js) - Google Analytics