- 主题:C++的异步模型以后就是sender/receiver这个框架了
我的是。
【 在 z16166 的大作中提到: 】
: sender/receiver可不是两个库函数啊
:
--
FROM 221.218.61.*
这俩结合起来才是完整的透明的异步IO环境。
【 在 hgoldfish 的大作中提到: 】
: 纤切换是纤程切换。事件循环是事件循环。
: 你一直把两个事情给混起来。
:
--
FROM 221.218.61.*
我的方法肯定是对的,因为实现了。没说别的方案不对。
如果你知道哪种组合不对,可以发出来,给大家避坑。
【 在 hgoldfish 的大作中提到: 】
: 假如协程方案有 3 种,事件循环也有 3 种,
: 那一共有 9 种组合。
: 你为啥认为自己的方案是对的呢?
: ...................
--
FROM 221.218.61.*
我可以报告一个,select不好,
一个原因是只支持1536以内的fd。
2,只支持一个线程守候,其他线程想加入fd,并且立即生效,能做,挺复杂。
3,找到激活的fd以后,还要找关联的context。
然后还要经过一个队列分发给其他线程。
切换协程太费劲了。
【 在 hgoldfish 的大作中提到: 】
: 假如协程方案有 3 种,事件循环也有 3 种,
: 那一共有 9 种组合。
: 你为啥认为自己的方案是对的呢?
: ...................
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
我只是介绍我的成功方案,没有否定别的意思。
你有好方案,可以说呀,大家可以自由发言,共同介绍经验和教训。
本坛讨论了不少协程和异步方案,但是还没有看到透明方案,我就是介绍一种透明方案。就是让写业务逻辑的,不必了解协程和异步技术,透明的使用这些功能。
主要模块是AIO_socket,AIO_file。还有一个AIO_sleep,还没写出来。
前缀应该是ASIO_,同步异步两用。协程环境异步,否则同步。
都是库模块,调用其函数即可。协程和事件循环都被封装在函数里,外边看不见。
函数代码很简单,复杂的是建立协程环境。
【 在 hgoldfish 的大作中提到: 】
: 唉,其实我只是想说存在别的对的组合。
: 你的组合对不对另外说。
: 关键是存在很多其它的组合啊。
: ...................
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
确实,我的协程切换就是跟事件循环紧密捆绑。
你们谈论的协程,怎么与事件捆绑,我百思不得其解。
我看不出来,不是为了等待某种事件,为何要切换。
【 在 hgoldfish 的大作中提到: 】
: 主要是你在说协程切换的时候,经常和协程调度(事件循环)混起来说。
: 这是两回事。所以我忍不住提醒一下 :-)
:
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
这是紧密关联的两件事。协程之所以需要切换,就是因为IO不能顺利完成(或者说,需要等待某种事件)。我一直强调,线程调度,协程调度,核心就是事件循环。我用epoll调度。
【 在 hgoldfish 的大作中提到: 】
: 主要是你在说协程切换的时候,经常和协程调度(事件循环)混起来说。
: 这是两回事。所以我忍不住提醒一下 :-)
:
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
各种事件工具都是可以的。我感兴趣怎么用IOCP。
至于你说的语法糖,当然可以用,习惯问题,我看不出来必要性。
语法解释,词法分析,我也常用。
看了你的流程,感觉就是主流程与子流程掉了个个,可以,但不是必须。
【 在 hgoldfish 的大作中提到: 】
: 首先,可以不存在事件循环。协程之间自行切换。例子是 generator 模式。我在写编译器的时候,lexer 和 compiler 都是协程,它俩来回切换。
: 其次,存在没有 io poll 的事件循环。也就是纯粹的 timer 循环。事件循环里面只有 timer 事件,没有其它事件。
: 最后呢,事件循环不一定用 epoll. windows 下也可以用 iocp, linux 下还有 io_uring 等等。
: ...................
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
可以可以,我没有任何异议。
你说的io_uring,AI了一下,是个好东西。我算是抛砖引玉,谁感兴趣的,把epoll换成io_uring。
我用过kqueue,比epoll好用。
【 在 hgoldfish 的大作中提到: 】
: 不是语法糖。我说的也是 c++ 的啊。
: 我这边有个核心工具,用 c++ 写的 olap 时间序列数据库。它包含一个表达式引擎。
: 里面的 lexer 和 compiler 就是用两个协程来回切换,没有用到任何事件循环。
: ...................
--
FROM 221.218.61.*
io_uring 基本工作原理
环形缓冲区:包含两个核心环形队列——提交队列(SQ)和完成队列(CQ)。
提交请求:用户将 I/O 请求(如读、写)放入 SQ,通知内核处理。
内核处理:内核从 SQ 取出请求并执行,完成后将结果放入 CQ。
获取结果:用户从 CQ 中读取完成的请求结果,进行后续处理。
从cq取,得有事件通知吧?
【 在 hgoldfish 的大作中提到: 】
: 首先,可以不存在事件循环。协程之间自行切换。例子是 generator 模式。我在写编译器的时候,lexer 和 compiler 都是协程,它俩来回切换。
: 其次,存在没有 io poll 的事件循环。也就是纯粹的 timer 循环。事件循环里面只有 timer 事件,没有其它事件。
: 最后呢,事件循环不一定用 epoll. windows 下也可以用 iocp, linux 下还有 io_uring 等等。
: ...................
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*