摸鱼开发纯 C 协程框架的后续和心得 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
piaodazhu
V2EX    程序员

摸鱼开发纯 C 协程框架的后续和心得

  •  1
     
  •   piaodazhu
    piaodazhu 2022-11-13 16:56:25 +08:00 2414 次点击
    这是一个创建于 1070 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这学期对协程有点兴趣,于是在摸鱼期间搞了一个纯 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 ~

    3 条回复    2022-11-13 22:59:43 +08:00
    johnman
        1
    johnman  
       2022-11-13 16:58:36 +08:00
    点赞
    codehz
        2
    codehz  
       2022-11-13 18:16:44 +08:00   1
    代码里看到了好多双下划线的标识符,但是这在标准里属于保留字,用户代码不应该使用主要是编译器没准就给你占用了
    piaodazhu
        3
    piaodazhu  
    OP
       2022-11-13 22:59:43 +08:00
    @codehz 多谢提醒~已经全部修改了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2547 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 10:35 PVG 18:35 LAX 03:35 JFK 06:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86