这学期对协程有点兴趣,于是在摸鱼期间搞了一个纯 C 协程框架的项目。初版完成以后,发了这篇帖子:尝试搞了一个纯 C 的协程框架。帖子发出来以后,项目陆陆续续有了 50 个 star ,实在是非常感谢 V 友们的支持,让我小小的心灵受到了巨大的鼓舞。迄今为止,自我感觉已经将这个项目做到了当初期望的程度,后面摸鱼的重心可能转移到别处。在这里分享一下其间的工作和心得。
初版主要关注协程框架的核心功能,即调度器和协程配套的 API 。后续的版本主要的功能更新有:协程池、非对称协程、2-优先级调度和性能测试。协程池可以避免频繁申请和回收内存,也可以用来控制任务数量上限(这个效果也可以用初版中的 waitgroup 达成)。非对称协程个人认为是一种偏“麻烦”的协程编程方式,也就是手动yield()
和resume()
。本帖这个项目还是鼓励用默认的对称协程的方式,让调度器自动去做调度,代码会更加清晰。2-优先级调度支持优先调度某些协程。比如在 TCP server 中,为 accept 协程设置更高优先级,可以在相同的 backlog 参数的情况下承载更多的连接。性能测试主要测了网络并发和切换效率,对比方案有 IO 多路复用、pthread 多线程和腾讯的 libco 。最终的测试结果体现出该框架的性能还是相当可观的。
这段时间的开发还是很有收获的。其一是造轮子带来的天然的成就感。有时候这种造轮子并没有意义,但是个人认为这个轮子并不比已有的差,造出来真有实际意义。其二是一段时间的折腾后,对协程有了一定的认知。一开始觉得协程是个高级而神秘的东西,现在越发觉得核心的就那么一点东西,颇有一种“把厚书读薄”的通透感。其三是丰富了 coding 和 debug 的经验。项目代码量虽然不大,但是要把代码写得能够自我解释、把框架调顺还是不那么容易的,这么看来也确实收获了经验。
最后还是希望能有更多的朋友来看一看,用一用,提提意见。也欢迎来贡献代码。如果觉得项目有帮助,也欢迎推荐给其他人。代码已经产出了,多一个曝光,就多产生一份价值,hhhh 。
项目地址: https://github.com/piaodazhu/dyco-coroutine (再次求 star ~
1
johnman 2022-11-13 16:58:36 +08:00
点赞
|
2
codehz 2022-11-13 18:16:44 +08:00 1
代码里看到了好多双下划线的标识符,但是这在标准里属于保留字,用户代码不应该使用——主要是编译器没准就给你占用了
|