- 主题:觉得协程不是一个太好的编程模型
不知道回谁
不是CPP协程搞晚了,是CPP协程搞得太复杂了。
协程一般实现有两种,一种是类似事件循环机制,这个要求必须在单线程内。一种是任务调度模式,这里执行的单位是一个过程,这个由调度器实现执行,它不一定在一个线程内。
问题在于CPP的实现同时实现了这两点。
【 在 z16166 的大作中提到: 】
:
: 主要还是C++的协程规范搞得晚了,别的语言都用了多久了,而且是大规模使用,肯定可以积累好的实践和规范。
:
: 乱搞那肯定是没法维护的,就跟乱throw、乱catch异常一样
:
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
Python 那个asyncio太差劲了
【 在 hgoldfish 的大作中提到: 】
:
: Python 那边就没人讨论这些。
:
: 你见过有人讨论 Python yield 的使用吗?但 yield 其实就是协程的一种应用。
:
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
到了这一步你认为你还认为你需要你的的业务代码吗?
那你还不如设计一个dsl,把业务抽象出来,剩下就是优化你的执行器了
【 在 ylh1969 的大作中提到: 】
:
: 不会有用协程的业务代码。
: 业务必须是透明的使用协程,看不到的。
: 比如,把线程池模式改成协程模式,就是底层函数的改变,跟上层没有任何关系。上层是同步调用IO,改完还是同步,里边是否yield,甚至换了线程,业务是不知道的。
: 所以,要告诉写业务软件的,你的线程锁不能跨越IO,自己想办法。
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
不是,这个就不叫协程了,叫做异步任务
【 在 ylh1969 的大作中提到: 】
:
: 说的对。你也承认有多线程协程的需求。
: 肯定调度器的作用,我在几个帖子里提到了调度器,没人注意。
: 【 在 VincentGe 的大作中提到: 】
: : 不知道回谁
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
我的意思是,对于你的业务代码,应该尽可能简单,抽象,易于理解,最好符合人的心智模型,业务人员也应该可以理解。
如果你在你的业务代码中混入协程,多线程代码,你的代码会变得非常难以理解,既然如此,你为什么不设计一个dsl,再实现一个执行器,这样,你不就成功实现了业务和实现的解耦?
【 在 ylh1969 的大作中提到: 】
:
: 什么叫业务代码?难道你弄了个协程,就能股票交易啦!
: 交易代码里还得有yield?
: 【 在 VincentGe 的大作中提到: 】
: : 到了这一步你认为你还认为你需要你的的业务代码吗?
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
额,但两者不是同一个东西,不是吗?
【 在 ylh1969 的大作中提到: 】
:
: 协程,就是执行异步任务的一种手段,一种工具。
: 异步操作同步化就是它的特点。
:
: 【 在 VincentGe 的大作中提到: 】
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
异步一个典型的模型是回调。是不是非常容易的解决了你的问题。
另,GUI编程对数是事件驱动的,没有你这个问题。
异步任务是可以取消的。对于一个无副作用的函数,没有区别。
【 在 hgoldfish 的大作中提到: 】
:
: 如果一个业务是异步的,那么它的异步是无法消除的。
:
: 比如,你向银行发送了一个汇款申请。但是啥时候真的完成汇款,这是异步的。类似的还有网络请求。发送任务,然后等远程执行完毕,再继续本地下一步的动作。这样的场景在 GUI 编程混合网络请求时特别常见。
:
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
这个循环本身就是就是 事件循环 ,从本质而言,就是异步模型,但表现上,是同步代码。
我刚刚看了eventlet-pyqt库,在最新的qt6.8中,pyqt是可以使用异步的。
【 在 hgoldfish 的大作中提到: 】
:
: 以前 DOS GUI 编程的时代可不是啥事件驱动的。while (true) 循环检测是否被按下了某个按键。现在可以被替换成 await key-pressed-event;
:
: 我专门弄了一个 eventlet-pyqt 的开源库,还有个 qtng 的开源库。都是为了在 GUI 里面做协程开发。破除了 GUI 编程是异步的这种思维误区。
:
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
对于你后面的说的,协程实质上有两种看法,对应我前面说的部分
有人认为协程就是一个local的事件循环,她提供了一个单线程内的同步模型,这个就是所谓的用户线程
有人认为协程是一个抽象的task调度器,使得任务在多个线程内并行。
对于这两种,CPP的协程都实现了。于是,它被混用了。
我个人是赞同第一种看法,因为这个模型足够简单。对于第二种,实际上我们完全可以通过第一种实现(线程池+事件循环+某种类似队列的通信机制)
我个人让为,协程,异步这两个概念是完全不同的东西,需要澄清。
【 在 hgoldfish 的大作中提到: 】
:
: 以前 DOS GUI 编程的时代可不是啥事件驱动的。while (true) 循环检测是否被按下了某个按键。现在可以被替换成 await key-pressed-event;
:
: 我专门弄了一个 eventlet-pyqt 的开源库,还有个 qtng 的开源库。都是为了在 GUI 里面做协程开发。破除了 GUI 编程是异步的这种思维误区。
:
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*
其实也算
协程是语言层面的,和线程的比较只能说大部分情况下,协程是并发,线程是并行
其实你说的这个更对应异步任务的概念,这里线程是一个调度器。
我提一个这个需求,以表达区别,我需要临时在一个线程内实现并发性IO操作,这个线程是线程池的一部分,请问,该怎么实现?
【 在 hgoldfish 的大作中提到: 】
:
: 给你一个概念辨析:
:
: 协程和纤程是啥关系?
:
#发自zSMTH@CDU.MP
--
FROM 113.143.105.*