- 主题:觉得协程不是一个太好的编程模型
148楼结合149楼一起看,解释清楚了协程在事件循环中的作用。
对楼主说一句,在148楼的事件循环里,如果应用插件没有IO需求,已经是完美的,实现了对CPU资源的最充分的运用,真的没有协程需求。如果有IO,并且有长时间的等待,就有了协程需求。见149楼。
【 在 hgoldfish 的大作中提到: 】
: 事件循环跟协程是两回事啊。
: 事件循环只是协程的一种用途。
: 理论上可以不使用事件循环实现协程的。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
另外,纵观我的发言,都是站在框架的角度,不涉及任何具体应用,所有应用都抽像成task。只讨论task的调度问题,进程,线程,协程都是调度工具。讨论什么调度方法能够充分利用系统资源。
至于框架与应用的结合,见本版,服务器动态模块热插拔管理,把应用写成动态模块,
https://www.newsmth.net/nForum/#!article/CPlusPlus/431596加入指定目录,写个客户端,指名调用就可以了。至于执行器,是进程,线程,协程,基本不需要关心。
【 在 hgoldfish 的大作中提到: 】
: 事件循环跟协程是两回事啊。
: 事件循环只是协程的一种用途。
: 理论上可以不使用事件循环实现协程的。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
task就是一个总context。里边有好多子context。
从线程池改造成协程时,添加一个ucontext,
然后就是4个函数:
makecontext//设置协程入口
getcontext//初始化ucontext
setcontext //resume
swapcontext//yield
C的协程就这么点东西。
【 在 hgoldfish 的大作中提到: 】
: 嗯。我比较想讨论的是,你这个 "task" 概念不够清晰明了,还是 "coroutine" 这个词比较适合描述你的想法。
: 而用户线程,最好用巨硬以前发明的纤程 (fiber) 来指代。这样子:
: coroutine <-impl-> process
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
跟内核毫无关系。
get就是拷贝寄存器保存现场
set就是恢复现场
swap就是get+set。
make更没用,就是设置一个指针。
协程就这么简单,复杂的是调度。
我给的就是调度方案之一。
epoll调度简单省事,否则自己整事件自己搞排队。
哦,对了epoll是陷入内核的,但是应用很普遍呀!
【 在 hgoldfish 的大作中提到: 】
: 这个实现不流行,属于 stackful fiber 的实现方式,但是奇葩的是,这个调用会陷入内核。所以其实没啥人用这个调用。
:
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
源码我见了,不进内核。
【 在 hgoldfish 的大作中提到: 】
: 原理是这样没错。但 linux 实现的 swapcontext() 比较奇葩,会陷入内核。所以这几个 posix 函数没人用。
:
--
FROM 221.218.60.*
感谢。
多保留一个信号量掩码,也行。
每个协程有自己的,可能遇到了什么问题而做。
其他就是一个get一个set。它不調函数了,直接干,稍稍快一点。
总的来说,这套协程工具挺好的。
【 在 hgoldfish 的大作中提到: 】
: linux 的实现比较奇葩一些。有个 signal 的处理进了内核。
: github dotcom/bminor/glibc/blob/master/sysdeps/unix/sysv/linux/x86_64/swapcontext.S#L74
:
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
陷入内核也没啥,就是改个标志,没有IO也没有事件。
每个协程有自己的掩码而已,估计是调度器的需求。
我能想象的是,用signal中断当前协程进入调度程序,也允许协程屏蔽这个信号。
【 在 hgoldfish 的大作中提到: 】
: 兼容性问题吧。POSIX 里面是这样的规定的。
: 基本上大家就是默默地把 swapcontext 的那部分源码拿过来,然后去掉 signal 的处理,就搞出自己的纤程实现了。
: 话说,我也没看懂那段 signal 处理是干嘛用的。反正 boost 也没处理 signal,避免陷入内核。不陷入内核的话,纤程的切换和函数调用没差多少。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
多谢,看明白了。
IOCP可以用作线程池调度。
也可以做多线程协程。
【 在 z16166 的大作中提到: 】
: 排队和派发是windows内核实现的,并不开源,哈哈
: 让chatgpt帮你写个简单的IOCP例子就知道了
: 或者MS的这个例子
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
我主要是socket异步IO。
GPU是个有意思的用途,考虑过,可惜没机会玩了。
词法解析,一直在浅度运用,没想出来怎么用协程,不过这个题目有意思。
【 在 hgoldfish 的大作中提到: 】
: 协程如果只用作文件 IO 调度就太可惜了。
: 举个例子,opencl 提交多个任务,异步等待 gpu 计算完毕返回,也很适合协程模型。
: 总之,看到异步,就可以想到协程。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*