05 | 协程:如何快速地实现高并发服务?
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
协程:高并发服务的快速实现 本文深入探讨了协程在实现高并发服务方面的重要性和应用。传统多进程和多线程模式在实现高并发上存在内存消耗过大和上下文切换成本高等问题。异步化编程通过应用层代码实现请求切换,降低了切换成本和内存占用空间,但容易出错且改造工作困难。协程作为一种兼顾开发效率与运行效率的解决方案,能够在异步化基础上实现高并发,同时使用阻塞函数写同步化代码。协程的出现为高性能服务的未来发展指明了方向。 协程融合了多线程与异步化编程的优点,既保证了开发效率,也提升了运行效率。通过用户态代码切换协程,降低了切换请求的成本,使得协程中的业务代码不用关注自己何时被挂起,何时被执行。优秀的协程生态下,常用服务都有对应的协程SDK,方便业务代码使用。与IO多路复用结合的协程框架可以自动挂起、切换协程,进一步提升开发效率。 然而,协程并不是完全与线程无关,线程可以帮助协程充分使用多核CPU的计算力。遇到无法协程化、会导致内核切换的阻塞函数,或者计算太密集从而长时间占用CPU的任务,还是要放在独立的线程中执行,以防止影响所有协程的执行。 总的来说,本文通过对传统多进程、多线程模式和异步化编程的局限性进行分析,引出了协程作为解决方案的重要性,并阐述了协程的优势和应用场景。对于想要了解高并发服务实现方式的读者来说,本文提供了清晰的技术概览和发展趋势,具有很高的实用价值。
《系统性能调优必知必会》,新⼈⾸单¥59
全部留言(31)
- 最新
- 精选
- 忆水寒优点: 1、首先协程是比线程更轻量级的对象,在Linux内核来说,线程和进程最终对应的都是task结构。 2、从操作系统的角度来看,线程是在内核态中调度的,而协程是在用户态调度的,所以相对于线程来说,协程切换的成本更低。 3、协程可以认为是一种并发编程技术,性能比较高,可用性也比较高。Java中的Loom 项目的目标就是支持协程,像go语言更是天然支持协程。 在我们项目中没有用到协程,主要还是使用的还是异步回调方式。 主要原因是:大家不知道协程(接收度比较低,觉得没用过可能会遇到很多坑,万一影响产品稳定性怎么办),而且产品里面已经充斥着大量的回调,没法大规模切换了。
作者回复: 是的,协程还需要生态上各类SDK的完善
2020-05-08524 - 郭郭老师,有没有比较好的C++协程库推荐一下?
作者回复: 阿里开源的libeasy你可以考虑下哈,非常高效,在阿里的合伙人多隆写的协程库,代码质量很高
2020-05-08516 - Geek_89bbab再补充一些, 1. 一些协程库会使用共享栈,如腾讯的libco。 2. 协程调度和内核调度相比另一个高效的原因,内核是抢占式的调度,协程是非抢占式的、按需调度,所以协程的调度次数远远小于内核的调度次数。
作者回复: 谢谢Geek_89bbab的分享!!
2020-05-09412 - 苦行僧就记住一句话 协程就是用户态的线程
作者回复: 是的
2020-05-148 - 杉松壁协程既然在用户态,是怎么有权限切换CPU寄存器的?
作者回复: 通过汇编语言直接修改寄存器的值就可以做到,具体你可以看下汇编指令
2020-06-2845 - 那时刻使用过go语言里的协程,通过GMP来完成goroutine的调度,简单来说,通过P来绑定内核线程M于协程G。通过老师的讲解,加深了理解。
作者回复: ^_^
2020-05-0835 - Kvicii.Y陶老师,协程和线程的区别点在于:线程是CPU通过寄存器进行切换,协程是在用户态中进行切换,除此之外二者还有什么更细微的差别吗?
作者回复: 线程是由内核实现的,其切换是在内核态进行,因此有内核态与用户态的切换成本,而且内核很难高度定制化,因此它通常考虑的是通用场景,不会为了高并发服务器做过多优化; 协程是由应用代码实现,且主要是用于高并发服务器,耗费内存很小,多个请求间的切换成本也很低。
2020-06-202 - 范闲没有用过协程。cpp没有协程标准库。另外协程本身也依赖于线程吧。只不过是一个线程可以对应多个些协程。
作者回复: 可以参考阿里开源的libeasy,是一个很高效的C/C++协程库
2020-05-182 - 托尼斯威特老师您好,跟您确认几个问题,不知道我理解的对不对。 大家谈高并发,有的时候谈的是高并发连接,有的时候谈的是高并发请求,高并发连接用epoll eventloop就可以了吧? 这篇文章主要是讲高并发请求。本来业务逻辑里需要阻塞线程,而用协程池取代线程池处理请求,可以节约大量的线程。 我疑惑的是,实际应用服务器一般要么是Cpu瓶颈,要么是内存瓶颈,我们的tomcat服务跑30个线程可以处理200QPS,CPU或者内存就接近100%了。这种情况我怎么觉得异步优化和协程优化都没什么用?
作者回复: 对,CPU、网卡通常是瓶颈,这时应该看看CPU究竟消耗在哪个函数上了,火焰图是个很好的工具。对于IO型应用,内存一般不是瓶颈。
2021-07-011 - 木头发芽公司所有的微服务都用go写,所以协程一直都在用,通过这节更深入的理解了协程的出现解决的问题及其原理.对GMP模型的理解有了更底层的知识支撑.
作者回复: 后面我会再写一篇与GO协程相关的加餐
2020-08-151