- 主题:觉得协程不是一个太好的编程模型
所以这里的问题还是现在单个线程占用的资源过多,线程是个比较“重”的调度单位
如果能低成本的创建并调度线程,那么你现在这种模式就非常简洁实用。
cpu硬件的趋势就是核心越来越多,充分利用多核比挖掘单核效率更重要。
如果为了充分利用单核,而给多线程模式带来障碍,那就得不偿失。
【 在 ylh1969 的大作中提到: 】
: 见10楼,最后一句。
: 而且,我就是在多线程模型中,有了协程需求。
: 整个系统是个线程池的socket服务器。
: ...................
--
FROM 223.72.70.*
如果协程只能困守在一个线程,那么负载均衡就是一个问题,没有办法高效率的使用多核。
这个损失,可比线程协程调度时间那点差异大太多啦。
【 在 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.*
两者就不是一个并发模型,他们的差异实际上非常大。
async/await 是协作式的,他们本身就在一个线程内。
spawn,go的语法更多的类似异步任务的概念。
【 在 hgoldfish 的大作中提到: 】
:
: 我说的是,在语法层面是使用 async/await 还是 spawn 还是 go. 其实只是语言关键字的问题。它们的含义是差不多的。
:
: 我个人偏向使用 spawn/go 而不是传染的 async/await 丑爆了。
:
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
每个语言实现不太一样。但就CPP而言,协程可以完全做到不跨线程。
但是,就协程而言,其实可以实现一个类似的锁机制。
【 在 ylh1969 的大作中提到: 】
:
: 进程是跨不了,但是线程与协程没有绑定关系
: 。
: 即使单线程协程,也不能用线程锁,因为都在一个线程里,锁不住。
: 【 在 VincentGe 的大作中提到: 】
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
我理想的模型是,设法降低单个线程的开销,然后创建大规模的线程池。
就不用担心线程阻塞不够用。系统会简单很多。
【 在 ylh1969 的大作中提到: 】
: 所以我是在线程池模式使用协程,线程不需要反复创建,线程池里就那么几个线程,一般是等于核数。它们的调度基于epoll,实现协程后,epoll就成了协程调度器。
: 系统启动后,所有的线程都在epoll_wait。直到出现一个被激活的fd,一个线程得到它的context,就是协程,然后转入这个协程,直到它需要再次IO,就会yield该线程,把自己排入epoll队列,线程跑去epoll_wait。这个线程下次可能得到另一个context,这个协程下次也可能被另一个线程捕获。
: 这种不绑定线程的协程体系,最省事,不需要写额外的调度和负载均衡策略。
--
FROM 223.72.70.*
那你这么做还是有问题。
协程不是一个独立的模块存在,它在执行时一定位于某一个线程内。它的设计本身就是单线程模型内的并发模型(不并行)
按照你说的,它和异步任务相似。协程调度器持有一个类似线程池的东西,将异步任务调度到某一线程线程执行。
协程是一个较为低级的东西,它具有更好的可控性,异步任务不同,它是更加抽象的东西。
我记得前面谁好像提了一句async/await 的传染性问题,一句话,这是实现问题。
【 在 ylh1969 的大作中提到: 】
:
: 如果协程只能困守在一个线程,那么负载均衡就是一个问题,没有办法高效率的使用多核。
: 这个损失,可比线程协程调度时间那点差异大太多啦。
: 【 在 hgoldfish 的大作中提到: 】
: : 你这个理解也还是错误。
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
你看看Erlang的设计
【 在 finlab 的大作中提到: 】
:
: 我理想的模型是,设法降低单个线程的开销,然后创建大规模的线程池。
:
: 就不用担心线程阻塞不够用。系统会简单很多。
:
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
Erlang里全叫进程。
【 在 VincentGe 的大作中提到: 】
: 你看看Erlang的设计
:
: #发自zSMTH@CDU.MP
--
FROM 221.218.60.*
不跨线程挺麻烦,跨线程反而简单。
【 在 VincentGe 的大作中提到: 】
: 每个语言实现不太一样。但就CPP而言,协程可以完全做到不跨线程。
: 但是,就协程而言,其实可以实现一个类似的锁机制。
:
: ...................
--
FROM 221.218.60.*