- 主题:觉得协程不是一个太好的编程模型
你这个理解错误。虽然你用了很久的协程。但是我觉得你太小看协程了。
协程应该是比进程、线程更高一级的抽象。和函数调用是同级别的,可以理解成异步的函数调用。
至于具体是使用线程、纤程还是进程来实现,或者根本就是混合实现那是另外的事情。在具体的调度和内存管理时,还分成 stackless, stackful 两种呢。
golang 和 java 就是典型的混合实现,纤程在线程间自动调度。
【 在 ylh1969 的大作中提到: 】
: 一般情况并不需要协程。
: 只有异步IO时,将它表达为同步,才需要。
: 简单点,在线程池网络编程中,长时间的同步IO,占用线程时间太长,影响别的任务。在等待IO期间,释放线程,由一个协程等待IO。
: ...................
--
修改:hgoldfish FROM 27.154.110.*
FROM 27.154.110.*
你这个理解也还是错误。
你那套协程之所以需要锁是因为你实现的纤程会被调度到多个线程。
但是协程也可以实现为不自由调度的。当时每个协程非常确定性的在一个线程里面运行。只能跑单核。
我们日常使用锁,实际上有两个作用:同步原语以及内存互斥屏障。
你们可以仔细想想,其实同步原语还是小事。锁更多的是后者的使用场景。如果协程只在一个线程里面被调度,那么后者是不需要的。又因为协程都是串行的。此时,只有极少的情况下需要协程锁。
【 在 ylh1969 的大作中提到: 】
: 错。
: 协程缺乏锁机制会出很多问题。
: 有人给协程写锁。
: ...................
--
FROM 27.154.110.*
内核有用协程。我记得之前 bcache 的维护者有提到他们使用了内核态的纤程。
使用协程确实可以到内核的设计进行改造。比如那个 irq 的处理过程,就是典型的协程化场景。反正,凡是异步,多多少少都可以使用协程思维进行重新改造。
【 在 overcomeunic 的大作中提到: 】
: 有了协程,更象是有了一个确定性很强的状态机
: 但这个状态机又跟业务有关,好象不管是 内核|编译器 ,都没有办法灵活地帮业务做一些定制
: 内核看着自己倒是可以用协程再提升一下性能,盲猜收益不会很大。
: ...................
--
FROM 27.154.110.*
async/await 纯粹是语法问题。都是从 c# 那边抄过来的。人家 golang 和 java 搞的协程语法就是你想的那样。在程序员看来,反正 java 的 BIO 就是同步调用。至于 java 怎么在底层转成 NIO, 那是 java 编译器的事情。
【 在 finlab 的大作中提到: 】
: 协程机制与线程混用带来更高 的复杂性。
: 异步调用到最后,还是要同步,不如一开始就同步。
: 比如,await readAsyn(); await processAsyn() 这种模式不过是为了让出空闲时间的控制权。
: ...................
--
FROM 27.154.110.*
多线程是可以利用多核性能的,单线程,再多的协程,也只用到一个核。
【 在 poocp 的大作中提到: 】
: 你说了半天,这些问题还是多线程带来的啊。
:
--
FROM 221.218.60.*
这个不同意你,回头再说。
【 在 hgoldfish 的大作中提到: 】
: 你这个理解也还是错误。
: 你那套协程之所以需要锁是因为你实现的纤程会被调度到多个线程。
: 但是协程也可以实现为不自由调度的。当时每个协程非常确定性的在一个线程里面运行。只能跑单核。
: ...................
--
FROM 221.218.60.*
【 在 finlab 的大作中提到: 】
: 协程很多场合是为了节省线程切换的成本,提高cpu的利用率。
: 但是经常把一个事情劈成两半,绕了半天还是要再捏到一起。
: 既然协程这么流行,那就不如在cpu和操作系统、编译器层面进行优化,
: ...................
协程和进程线程是不同的东西,
协程最大的有点有二
首选, 协程节省切换开销, 这个是最明显的好处, 但不是最大的。
最主要的好处是, 它不像线程, 线程是抢占式的多任务, 而协程是协同多任务,
抢占多任务, 虽然简单粗暴, 但是增加了时间片的来回抢夺开销。
而协同多任务, 不仅没有时间片导致的, 抢夺切换, 就是协同切换也可以有具体的应用逻辑来控制,
所以, 可以有最好的性能。当然, 坏处就是会增加程序设计的难度和复杂度。
目前的协程模型, asyn await 方式, 确实设计的简洁, 但是不优美, 甚至有时给一部分程序员
带来理解困难。
--
FROM 115.171.244.*
这说明你还没有理解协程模型的真正意义。
协程是对 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.*