34 | 并发中的编译技术(二):如何从语言层面支持协程?
该思维导图由 AI 生成,仅供参考
协程(Coroutine)的特点与使用场景
- 深入了解
- 翻译
- 解释
- 总结
协程技术在编程语言中的支持和实现是本文的核心内容。文章首先介绍了协程的特点和使用场景,包括资源占用少、用户自控并发等特点,并通过生动的例子和图表说明了协程在生产者消费者模式和IO密集型应用中的应用场景。随后对比了同步编程和异步编程的优缺点,并指出了异步编程模型中的回调地狱问题。文章还深入探讨了协程的运行原理,包括协程的活动记录保存和恢复,以及实现协程的调度机制。接着介绍了Stackful和Stackless两种协程机制的特点和区别,以及对称和非对称协程的概念。最后,对C++、Python、Java、JavaScript、Julia和Go等常见语言中协程的支持和实现进行了梳理和比较。整篇文章通过生动的例子和图表,深入浅出地阐述了协程技术的特点、实现原理以及不同语言的支持情况,为读者提供了全面了解协程技术的基础知识。 C++20标准中增加的协程特性以及微软的Stackless模式的实现,以及腾讯的libco协程库的创新性共享栈机制,为读者展示了C++中协程的支持和应用。Python的generator模式和3.4版本之后引入的异步IO的协程模式,以及Python在高并发场景中的限制也得到了介绍。对于Java,文章提到了一些支持协程的方法,以及第三方库的实现情况。而JavaScript从ES6引入的generator功能和ES7引入的async/await支持异步编程,使得协程在JavaScript中的应用变得更加友好。这些内容为读者提供了对不同语言中协程支持和实现情况的全面了解。 在Goroutine实现了丰富的调度机制以后,它已经变得不完全由用户的程序来主导协程的调度了,而是能够更加智能、更加优化地实现协程的调度,由操作系统的线程调度器、Go语言的调度器和用户程序三者配合实现。这也是Go语言的一个重要优点。文章通过对不同语言中协程支持和实现情况的深入探讨,为读者提供了全面了解协程技术的基础知识,使其能够快速了解协程技术在编程语言中的应用和实现情况。
《编译原理实战课》,新⼈⾸单¥59
全部留言(9)
- 最新
- 精选
- 易昊这篇文章太有启发性了,我想照着文章给出的思路自己尝试实现一下协程
作者回复: 牛!为你点赞!
2020-09-196 - long协程为什么没有线程的使用,那么广泛和流行?
作者回复: 我的理解:线程是操作系统层面就提供的,所以各门语言把线程封装一下,就可以提供给程序员使用。 而协程不是操作系统从底层就支持的,所以实现起来工作量要大一些。 另外,协程主要用于高并发的场景。如果你的程序对并发没有那个高的要求,那自然也就不需要使用协程了。
2020-10-234 - myrfy老师提到了go的协程是做的最彻底的,但是这样的做法也使得他的ffi和cffi差别太大,cgo的调用效率低等问题。在提高go和c之间调用性能上,老师有什么思路吗?
作者回复: 这个问题,其实要回到语言的设计上。每门语言都很难在所有的地方擅长。go语言调用c库的优先级,应该不是特别高,属于除非没有别的办法,就最好不去调用c。因为全部用go写的程序,才最适合它去做并发调度。 另外,作为go语言的设计目标,在abi转换上的这点开销,是无关紧要的。go语言做调度、做垃圾回收,都要有不少的开销。 不仅go调c不容易,c调go就更不容易了。因为像go这样的语言都带有gc。 作为对比,Rust的设计,使得它调c,以及c调rust都很方便,因为它们要满足的需求和底层的实现思路几乎是一样的。Rust不用程序员自己写malloc和free了,但只是编译器帮忙做了这件事情。
2020-08-312 - kkxue深度和广度兼具,赞!
作者回复: 感谢肯定:-)
2020-10-03 - Tino's Park请问老师:协程与异步 IO 结合是一个趋势;这个有进一步的介绍资料吗? 谢谢。
作者回复: 1.首先,可以把Python的Async io和协程的关系学习一下。参考文章:https://realpython.com/async-io-python/ 据我私人渠道的消息,Python的异步io功能的作者,纠集了一拨人,做了一个初创公司,开发一种新的数据库,也是充分体现异步IO优势的那种。 2. JavaScript新引入的async/await关键字,也可以研究一下。跟Python类似。 3.腾讯开源的那个协程库,也是配合异步化的网络通讯的,你可以查阅他们的资料。 4.在erlang的世界里,io从来都是异步的。不过与之配合的并发模式是actor。你也可以查查相关的资料。 3.
2020-09-22 - sunbird技术牛的人很多,但能讲这么透彻的不多,以前好多想不通的问题,瞬间都想明白了,多谢。 对于协程用于高并发这一点还是有点不清楚。nio可以提高并发是因为其利用了设备中断和DMA的方式,从硬件优化了IO的效率。但协程还是靠线程来执行操作,它虽然占用的内存比较少,但个人感觉原理有点类似java中的线程池的概念,而线程池显然占用的内存更少,其和nio的结合对于并发来说岂不更好。 我感觉协程重点在于“协”这个字,和线程池比,他的不同协程之间的协作性好。不知道理解的对不对。 最近在学kotlin的协程,一直学不明白,看了这篇文章,才是真正懂了,再次感谢。2020-11-131
- enjoylearning读起来很有意思,对协程的理解又加深了一步2023-12-01归属地:北京
- AKEI有个问题请教下老师。文章里面提到“在异步编程模型中,网络通讯等 IO 操作不必阻塞线程,而是通过回调来让主程序继续执行后续的逻辑。” 我的认知是,发起了io之后,操作系统必须要持有一个线程的fd,用于io返回后的回调的吧?这个持有的过程,异步模型就能让这个线程去继续做其他事吗?如果是这样,和io多路复用的区别在哪?2022-05-11
- ifelse大开眼界2022-01-27