`

深入浅出协程(Coroutine)

阅读更多

目录:

1、协程是什么

2、协程新思路

3、协程与GreenThread

4、协和调度器实现策略

 

1、协程是什么?

(1)线程

每一个线程都代表一个执行序列。当我们在程序中创建多线程的时候,看起来,同一时刻多个线程是同时执行的,不过实质上多个线程是并发的,因为只有一个CPU,所以实质上同一个时刻只有一个线程在执行。在一个时间片内执行哪个线程是不确定的,我们可以控制线程的优先级,不过真正的线程调度由CPU的调度决定。

(2)协程

协程跟线程都代表一个执行序列。不同的是,协程把线程中不确定的地方尽可能的去掉,执行序列间的切换不再由CPU隐藏的进行,而是由程序显式的进行。

所以,使用协程实现并发,需要多个协程彼此协作。

通俗易懂的回答:让原来要使用异步+回调方式写的非人类代码,可以用看似同步的方式写出来...

 

2、协程新思路

如果线程是一直处于运行状态,我们只需设置和CPU核数相等的线程数即可,这样就可以最大化的利用CPU,并且降低切换成本以及内存使用。要做到这点一般有两种方案:

1。异步回调方案:典型如NodeJS,遇到阻塞的情况,比如网络调用,则注册一个回调方法(其实还包括了一些上下文数据对象)给IO调度器(Linux下是Libev),当前线程就被释放了,去干别的事情了。等数据准备好,调度器会交结果传递给回调方法然后执行,执行其实不在原来发起的线程里了,但对用户来说无感知,但这种方式的问题就是容易遇到callback hell,因为所有的阻塞操作都必须异步,否则系统就卡死了。还有就是异步的方式有点违反人类思维习惯,人类还是习惯同步的方式。

2。GreenThread/Coroutine/Fiber方案 这种方案其实和上面的方案本质上区别不大,关键在于回调上下文的保存以及执行机制。为了解决回调方法带来的难题,这种方案的思路是写代码的时候还是按顺序写,但遇到 IO 等阻塞调用时,将当前的代码片段暂停,保存上下文,让出当前线程。等 IO 事件回来,然后再找个线程让当前代码片段恢复上下文继续执行,写代码的时候感觉好像是同步的,仿佛在同一个线程完成的,但实际上系统可能切换了线程,但对程序无感。

 

3、协程与GreenThread

什么是GreenThread? 

用户空间 首先是在用户空间,避免内核态和用户态的切换导致的成本。

由语言或者框架层调度

更小的栈空间允许创建大量实例(百万级别)

Goroutine与之区别是什么?

Goroutine 其实就是前面 GreenThread 系列解决方案的一种演进和实现。

首先,它内置了 Coroutine 机制。因为要用户态的调度,必须有可以让代码片段可以暂停/继续的机制。

其次,它内置了一个调度器,实现了 Coroutine 的多线程并行调度,同时通过对网络等库的封装,对用户屏蔽了调度细节。

最后,提供了 Channel 机制,用于 Goroutine 之间通信,实现 CSP 并发模型(Communicating Sequential Processes)。因为 Go 的 Channel 是通过语法关键词提供的,对用户屏蔽了许多细节。其实 Go 的 Channel 和 Java 中的 SynchronousQueue 是一样的机制,如果有 buffer 其实就是 ArrayBlockQueue。

 

4、Goroutine调度器实现策略

系统启动时,会启动一个独立的后台线程(不在 Goroutine 的调度线程池里),启动 netpoll 的轮询。当有 Goroutine 发起网络请求时,网络库会将 fd(文件描述符)和 pollDesc(用于描述 netpoll 的结构体,包含因为读 / 写这个 fd 而阻塞的 Goroutine)关联起来,然后调用 runtime.gopark 方法,挂起当前的 Goroutine。当后台的 netpoll 轮询获取到 epoll(Linux 环境下)的 event,会将 event 中的 pollDesc 取出来,找到关联的阻塞 Goroutine,并进行恢复。

 

参考资料:

并发之痛 Thread,Goroutine,Actor

http://toutiao.com/i6257295282237604354/

 

 

分享到:
评论

相关推荐

    深入浅出Unity协程.rar

    《深入浅出Unity协程》 Unity引擎是全球范围内广泛使用的3D游戏开发平台,它提供了丰富的工具和技术,使得开发者可以高效地创建交互式、实时的3D内容。在Unity中,协程(Coroutine)是一种非常重要的编程概念,它...

    CPP-Summit 2019 - 吴咏炜 - 深入浅出 C++20 协程.pdf

    ### 深入浅出 C++20 协程 #### 一、协程概念解析 ##### 1.1 协程定义 协程是一种在程序设计中的高级控制结构,它扩展了传统的子程序概念,使得函数可以在任意点挂起执行,并在稍后继续执行而不会丢失状态。协程比...

    pyasync:python异步编程示例(async, aio, tornado). 动态添加任务, 超时设置, 协程池限制并发数量

    pyasync参考文章参考文章1深入浅出地介绍了协程及其相关概念(loop事件循环, task任务, future结果对象), 层层递进, 容易理解. 相对于廖雪峰老师对async/await的两篇介绍文章, 更加系统, 且条理更加分明, 用作入门...

    Programming in Lua - 4th Edition.rar

    这本书深入浅出地介绍了Lua语言的基础知识、语法特性以及高级应用,对于程序员来说是一份宝贵的资源。 1. Lua简介:Lua是一种轻量级的脚本语言,设计简洁且高效,广泛应用于游戏开发、嵌入式系统、网络编程等多个...

    高清Programming_in_lua

    这本书深入浅出地介绍了Lua语言的基础概念、语法特性以及高级用法,帮助读者全面掌握这门小巧而强大的脚本语言。 Lua是一种轻量级的、解释型的、动态类型的编程语言,常用于嵌入式系统、游戏开发、脚本编写等领域。...

    google android 开发技术 中文文档

    这份PDF文档深入浅出地介绍了如何在Android平台上构建应用程序,涵盖了从基础概念到高级特性的各种主题,旨在帮助开发者提升技能并优化其应用性能。 首先,文档将引导读者了解Android开发环境的搭建,包括安装...

    android开发实战经典(3)

    在《Android开发实战经典(3)》这本著作中,作者魔乐科技(MLDN)的李兴华老师深入浅出地介绍了Android应用开发的关键技术和实践案例。这是一本为中级到高级Android开发者设计的教程,旨在提升读者的实战技能和解决...

    Android 开发艺术探索高清完整版

    《Android开发艺术探索》是一本深受Android开发者喜爱的著作,它深入浅出地探讨了Android应用开发中的各种技术和技巧。这本书全面覆盖了Android开发的各个方面,包括基础概念、UI设计、性能优化、网络编程以及一些...

    Linux程序设计 中文第4版

    根据提供的文件信息,“Linux程序设计 中文第4版”是一本深入浅出地介绍Linux编程技术的书籍。本书旨在帮助读者全面理解Linux环境下的程序设计方法和技术,适用于想要学习或提高Linux编程技能的读者。 ### 知识点一...

    《用python把你带进AI中的深度学习领域》网络编程基础部分.pdf

    总之,本部分通过深入浅出的方式,将网络编程的核心概念和实践方法融入到AI和深度学习的语境中,为开发者搭建了一个坚实的基础。掌握这部分内容,对于进一步学习大型Web框架以及在AI领域中处理网络数据、构建高效的...

    The-Python-3-Standard-Library-by-Example.rar

    《The Python 3 Standard Library by Example》这本书深入浅出地介绍了这些丰富的资源,帮助开发者充分利用 Python 的强大功能。 首先,让我们来看看 Python 3 标准库中的基础部分。包括数据结构如列表(list)、...

    python学习资料

    - "深入浅出nodejs.pdf"虽然不是Python书籍,但了解JavaScript的Node.js环境可以帮助理解异步编程和服务器端JavaScript。 6. **学习资源**: - "Python3-liaoxuefeng-jb51.rar"可能包含廖雪峰的Python教程,这是...

    python3.0廖雪峰

    廖雪峰的Python3.0教程不仅涵盖了以上这些核心变更,还深入浅出地讲解了Python的基础语法、面向对象编程、异常处理、文件操作、网络编程、正则表达式、标准库的使用等众多主题。通过学习他的教程,读者可以全面了解...

    Lua脚本语言基本教程高清版

    - **书籍推荐**:《Programming in Lua》是一本经典著作,深入浅出地讲解了Lua的各种特性及其应用场景。 - **社区交流**:加入Lua的官方论坛、Stack Overflow等相关社区,与其他Lua开发者交流心得、解决问题。 通过...

    Lua程序设计书籍

    《Lua程序设计书籍》是一本专为新手设计的lua编程教程,它深入浅出地介绍了Lua语言的基础知识,对于想要踏入游戏开发领域的学习者来说,这是一本不可多得的入门指南。Lua是一种轻量级的脚本语言,因其简洁、高效和...

    Android开发特刊

    这本《Android开发特刊》通过深入浅出的方式,将帮助初学者理解Android应用开发的基本原理和实践技巧,为后续深入学习和项目开发奠定坚实基础。虽然技术在不断进步,但基础知识和核心概念始终是不变的,因此,即便是...

Global site tag (gtag.js) - Google Analytics