- 主题:觉得协程不是一个太好的编程模型
这说明你还没有理解协程模型的真正意义。
协程是对 cpu/mult-thread/process 模型的抽象。它使得在单进程单线程层面有了轻量的并发模型。
【 在 finlab 的大作中提到: 】
:
: 协程很多场合是为了节省线程切换的成本,提高cpu的利用率。
:
: 但是经常把一个事情劈成两半,绕了半天还是要再捏到一起。
:
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
错
协程允许有锁,你这个锁的本质让一块代码是原子的,可以非常轻易的实现。
剩下的是实现问题,协程设计上就不应该允许跨线程进程。
实现上的问题不要怪设计。
【 在 ylh1969 的大作中提到: 】
:
: 错。
: 协程缺乏锁机制会出很多问题。
: 有人给协程写锁。
: 见2楼,多线程协程,有一个线程锁不允许跨越IO的要求。
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
你这个理解很棒!
【 在 overcomeunic 的大作中提到: 】
:
: 有了协程,更象是有了一个确定性很强的状态机
: 但这个状态机又跟业务有关,好象不管是 内核|编译器 ,都没有办法灵活地帮业务做一些定制
: 内核看着自己倒是可以用协程再提升一下性能,盲猜收益不会很大。
: 【 在 finlab 的大作中提到: 】
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
这个复杂性在我看来更多是使用者带来的。
你难道要在一个协程中使用多线程模型吗?
【 在 finlab 的大作中提到: 】
:
: 协程机制与线程混用带来更高 的复杂性。
:
: 异步调用到最后,还是要同步,不如一开始就同步。
:
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
async/await 的设计的角色是非常底层同步原语。
对于语言的模型都是同步的,async await 很好的标示一个函数如何被切分。
【 在 hgoldfish 的大作中提到: 】
:
: async/await 纯粹是语法问题。都是从 c# 那边抄过来的。人家 golang 和 java 搞的协程语法就是你想的那样。在程序员看来,反正 java 的 BIO 就是同步调用。至于 java 怎么在底层转成 NIO, 那是 java 编译器的事情。
:
: 【 在 finlab 的大作中提到: 】
: : 协程机制与线程混用带来更高 的复杂性。
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
那你大概是错误理解协程了,协程给你的是单进程单线程的并发模型。如何你要用对核,用多进程多线程模型。
在我看来,现在多进程线程模型的实现本身就不好。
【 在 finlab 的大作中提到: 】
:
: 放着那么多核不用,难道只在一个核上死磕吗?
:
: 【 在 VincentGe 的大作中提到: 】
: : 这个复杂性在我看来更多是使用者带来的。
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
两者就不是一个并发模型,他们的差异实际上非常大。
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.*
那你这么做还是有问题。
协程不是一个独立的模块存在,它在执行时一定位于某一个线程内。它的设计本身就是单线程模型内的并发模型(不并行)
按照你说的,它和异步任务相似。协程调度器持有一个类似线程池的东西,将异步任务调度到某一线程线程执行。
协程是一个较为低级的东西,它具有更好的可控性,异步任务不同,它是更加抽象的东西。
我记得前面谁好像提了一句async/await 的传染性问题,一句话,这是实现问题。
【 在 ylh1969 的大作中提到: 】
:
: 如果协程只能困守在一个线程,那么负载均衡就是一个问题,没有办法高效率的使用多核。
: 这个损失,可比线程协程调度时间那点差异大太多啦。
: 【 在 hgoldfish 的大作中提到: 】
: : 你这个理解也还是错误。
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
你看看Erlang的设计
【 在 finlab 的大作中提到: 】
:
: 我理想的模型是,设法降低单个线程的开销,然后创建大规模的线程池。
:
: 就不用担心线程阻塞不够用。系统会简单很多。
:
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*