- 主题:觉得协程不是一个太好的编程模型
如果协程只能困守在一个线程,那么负载均衡就是一个问题,没有办法高效率的使用多核。
这个损失,可比线程协程调度时间那点差异大太多啦。
【 在 hgoldfish 的大作中提到: 】
: 你这个理解也还是错误。
: 你那套协程之所以需要锁是因为你实现的纤程会被调度到多个线程。
: 但是协程也可以实现为不自由调度的。当时每个协程非常确定性的在一个线程里面运行。只能跑单核。
: ...................
--
FROM 221.218.60.*
所以我是在线程池模式使用协程,线程不需要反复创建,线程池里就那么几个线程,一般是等于核数。它们的调度基于epoll,实现协程后,epoll就成了协程调度器。
系统启动后,所有的线程都在epoll_wait。直到出现一个被激活的fd,一个线程得到它的context,就是协程,然后转入这个协程,直到它需要再次IO,就会yield该线程,把自己排入epoll队列,线程跑去epoll_wait。这个线程下次可能得到另一个context,这个协程下次也可能被另一个线程捕获。
这种不绑定线程的协程体系,最省事,不需要写额外的调度和负载均衡策略。
【 在 finlab 的大作中提到: 】
: 所以这里的问题还是现在单个线程占用的资源过多,线程是个比较“重”的调度单位
: 如果能低成本的创建并调度线程,那么你现在这种模式就非常简洁实用。
: cpu硬件的趋势就是核心越来越多,充分利用多核比挖掘单核效率更重要。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
Erlang里全叫进程。
【 在 VincentGe 的大作中提到: 】
: 你看看Erlang的设计
:
: #发自zSMTH@CDU.MP
--
FROM 221.218.60.*
不跨线程挺麻烦,跨线程反而简单。
【 在 VincentGe 的大作中提到: 】
: 每个语言实现不太一样。但就CPP而言,协程可以完全做到不跨线程。
: 但是,就协程而言,其实可以实现一个类似的锁机制。
:
: ...................
--
FROM 221.218.60.*
大量线程才效率低。那真是全干调度了。
最好是等于核数,多一两个无妨,太多效率会严重降低。
【 在 finlab 的大作中提到: 】
: 我理想的模型是,设法降低单个线程的开销,然后创建大规模的线程池。
: 就不用担心线程阻塞不够用。系统会简单很多。
:
: ...................
--
FROM 221.218.60.*
在大迸发的网络环境下,一个协程,被一个事件激活,就在某个线程内执行,不到IO时刻,一直都不会被调度。占死这个线程。此时期如果有别的激活,就有别的线程来干。直到它需要IO,且完不成,才会yield,下次resume不一定是哪个线程接手。
线程数=核数,线程执行期间就不会经常被打扰,发生切换,尽量减少切换开销。线程太多就会经常切换,轮流执行,才会发生切换开销问题。
线程池也避免了线程反复创建销毁的开销。一旦创建永不销毁。没事就在epoll_wait。
有啥问题?
【 在 VincentGe 的大作中提到: 】
: 那你这么做还是有问题。
: 协程不是一个独立的模块存在,它在执行时一定位于某一个线程内。它的设计本身就是单线程模型内的并发模型(不并行)
: 按照你说的,它和异步任务相似。协程调度器持有一个类似线程池的东西,将异步任务调度到某一线程线程执行。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
可以。拆进程前面也得有负载均衡。
【 在 hgoldfish 的大作中提到: 】
: 这完全可以从软件架构上解决。
: 比如对于 web 系统,系统里面有多少个核心,就启动多少个进程,大家一起抢请求就行了。本来 web 系统为了横向多机扩展,也得进程+协程的架构。
: 而对于一些 OLAP 类的应用,需要共享使用大量资源,问题也不大,一般仍然可以拆分出多种业务形态。
: ...................
--
FROM 221.218.60.*
大家讨论嘛,我贡献我的方案。
【 在 hgoldfish 的大作中提到: 】
: 其实你们想的这些事情,几乎每个方案都有现实的例子。
: 比如 python 和 js 的协程就是不跨线程的。c++20 目前的几个实现应该也是不跨线程的。
: 而 c#, java, go 都是跨线程的。
: ...................
--
FROM 221.218.60.*
最好线程数=核数,超一点也行,别超过2倍。
这样就不会发生过多的资源争夺,大量的线程切换。
【 在 mopo 的大作中提到: 】
: 多少才算太多?
:
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
我是从多进程,多线程,线程池一路走来,遇到了协程需求。
你们是一开始就站在协程角度看问题,所以不同。
没关系,百花齐放,方案摆在这里,有意者选用。
楼主认为不好,可以不用。也可以在这里学习一下,看看协程到底有多少种用法。我贡献一种。
【 在 hgoldfish 的大作中提到: 】
: 其实你们想的这些事情,几乎每个方案都有现实的例子。
: 比如 python 和 js 的协程就是不跨线程的。c++20 目前的几个实现应该也是不跨线程的。
: 而 c#, java, go 都是跨线程的。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*