muduo 后续有在现有代码上增加协程能力的计划吗 #579
Replies: 10 comments 1 reply
-
我把 muduo-library 邮件列表的回复贴在这里: 长话短说:首先,我认为 Go 的并发模型非常好用,写起来比基于事件回调的风格思路要顺畅许多;但是,我目前认为在 C/C++ 里搞用纯户态的 coroutine 没有前途。 coroutine 的本质是对 OS thread 的复用,好处是比 thread 更轻量(10 倍以上),memory locality 也更好,一个程序可以有几百上千的线程 vs. 几万的 coroutine。 根据我这几年所学,我认为正确的做法是让内核做上下文切换,但同时可以把调度的任务放到用户态,这样两方面的好处都占住了。 具体说来,如果 Linux 内核接受了 Google 的 switchto() 系统调用,那么 C/C++ 服务端编程就可以采用 Go 一样的编程模型,大家都轻松很多。 ref.
ps. Google 内部用 switchto() 已经很多年了。这也是我对 C++20 里的协程不感兴趣的原因。 陈硕 |
Beta Was this translation helpful? Give feedback.
-
感谢作者的答复和 ref,又有新的东西可以学习了 |
Beta Was this translation helpful? Give feedback.
-
您好,陈硕,经过几天对 您说的这个 Google swithto() 资料的阅读,我大致可以明白它基于 futex_swap() 实现,尽管现在这个补丁似乎被 LKML 抛弃了。 这个 futex_swap() 似乎是在让当前线程 1 执行 futex_wait(futex1) 进入睡眠, 并让对期望切换的线程 2 执行唤醒操作 futex_wake(futex2) , 然后同理线程 2 也可以通过同样的方式唤醒线程 1 并让自己进入睡眠. 但我仍然有一些疑问:
[1] https://news.ycombinator.com/item?id=24084348 |
Beta Was this translation helpful? Give feedback.
-
问一句,协程(如 |
Beta Was this translation helpful? Give feedback.
-
是的我觉得 |
Beta Was this translation helpful? Give feedback.
-
我不认为协程可以简单地与高性能划等号。 根据 SIGCOMM ’21 上的文章 Understanding Host Network Stack Overheads 的测试结果,在服务器硬件上,现在 Linux 内核网络协议栈(内核 5.4+)可以用 1 个 TCP 连接(单core)打满 40Gbps 网卡的单向带宽,但需要多个 cores 和多个连接才能用完 100Gbps 网卡带宽。也就说单线程 1 个 TCP 连接就可以发送或接收 5GBytes/s。 在程序的网络吞吐量接近这个量级之前,谈性能优化恐怕为时过早。 作为对比,i7-8665U CPU 算 SHA1 的速度大约是 1.2GBytes/s/线程,只有 TCP 单连接吞吐量的 1/4 左右。就是说,如果设计不当,checksum 这一步可能会成为数据传输的瓶颈。 |
Beta Was this translation helpful? Give feedback.
-
我用过的协程体会是:能优化代码结构,让逻辑更清晰,并不一定带来普适的性能提升。 |
Beta Was this translation helpful? Give feedback.
-
我不是做服务器linux开发的,但我本人完全赞同陈硕说的switchto语义完全可以替代coroutine的说法,coroutine本质上还是基于回调的语法糖,是没有办法做到使用“同步”代码块来表示“异步”行为的,从使用者的角度来说并不比直接基于回调的方式要减轻多少心智负担。可以说即没有解决干净语法层面的问题,对性能也起不了多大帮助。而真正从底层解决问题的思路就是把os context switch提升到user context switch,直接让玩家自己做cooperative scheduling,这个玩意儿其实就是fiber。 |
Beta Was this translation helpful? Give feedback.
-
reactor 就没法实现协程。 协程解决的是什么问题?协程解决的是回调地狱的问题。 至于所谓的协程性能高。其实并不是协程性能高。而是 proactor 模型带来的性能高。协程是用来解决 proactor 模型容易有回调地狱这个缺陷的。 你要求 muduo 支持协程,实际上是在要求 muduo 变成一个 proactor 模型。 |
Beta Was this translation helpful? Give feedback.
-
你不看discuss和issue的吗?,muduo不屑用协程
…---原始邮件---
发件人: ***@***.***>
发送时间: 2024年12月5日(周四) 下午2:06
收件人: ***@***.***>;
抄送: ***@***.***>;
主题: Re: [chenshuo/muduo] muduo 后续有在现有代码上增加协程能力的计划吗 (Discussion #579)
reactor 就没法实现协程。
协程解决的是什么问题?协程解决的是回调地狱的问题。
reactor都没有回调地狱问题,何来协程呢?
至于所谓的协程性能高。其实并不是协程性能高。而是 proactor 模型带来的性能高。协程是用来解决 proactor 模型容易有回调地狱这个缺陷的。
既然 muduo 是 reactor 模型,那么就没有回调地狱。没有回调地狱,就没有使用协程的必要。
你要求 muduo 支持协程,实际上是在要求 muduo 变成一个 proactor 模型。
这自然是不可接受的。
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: ***@***.***>
|
Beta Was this translation helpful? Give feedback.
-
看着似乎没有办法 发邮件到 [email protected]
We're writing to let you know that the group you tried to contact (muduo-library) may not exist, or you may not have permission to post messages to the group. A few more details on why you weren't able to post:
就在这里提问题吧
muduo 后续有在现有代码上增加协程能力的计划吗
基于当前的 reactor 代码,在这上面增加简单的调度能力和上下文保存与 restore 能力应该就能实现协程
大致思路如下:
1.1 主协程-不分配执行栈,
1.2 event_loop 协程-执行event dispatch 并调用回调,需要单独分配执行栈
1.3 其他协程-执行用户设定的 function,需要单独分配执行栈
Beta Was this translation helpful? Give feedback.
All reactions