- 主题:觉得协程不是一个太好的编程模型
Python 那边就没人讨论这些。
你见过有人讨论 Python yield 的使用吗?但 yield 其实就是协程的一种应用。
而之前 Python 的 gevent 也没人讨论。使用太简单了。
【 在 DoorWay 的大作中提到: 】
: 开发者更容易理解,版面就不会这么多大佬一直在讨论了。
: 我看是更容易一知半解。上手就干。
: 协程好调试是相对什么说的,我觉得是更难调试了。
: ...................
--
修改:hgoldfish FROM 27.154.110.*
FROM 27.154.110.*
所以 Python 协程我只认 gevent/eventlet 哈哈。至今没用过一次的 asyncio 那个垃圾货。
【 在 VincentGe 的大作中提到: 】
: Python 那个asyncio太差劲了
: #发自zSMTH@CDU.MP
--
FROM 120.41.212.*
如果一个业务是异步的,那么它的异步是无法消除的。
比如,你向银行发送了一个汇款申请。但是啥时候真的完成汇款,这是异步的。类似的还有网络请求。发送任务,然后等远程执行完毕,再继续本地下一步的动作。这样的场景在 GUI 编程混合网络请求时特别常见。
好了。我们现在再来考虑,要实现异步的业务,应该用哪一种技术呢?
【 在 VincentGe 的大作中提到: 】
: 我的意思是,对于你的业务代码,应该尽可能简单,抽象,易于理解,最好符合人的心智模型,业务人员也应该可以理解。
: 如果你在你的业务代码中混入协程,多线程代码,你的代码会变得非常难以理解,既然如此,你为什么不设计一个dsl,再实现一个执行器,这样,你不就成功实现了业务和实现的解耦?
: #发自zSMTH@CDU.MP
: ...................
--
FROM 39.144.251.*
假定这个是在手机客户端的工作。
那么在手机客户端里面就可以启动一个协程。去监听付款成功的事件。然后弹出提示或者指示用户做下一步的操作。
而你这种做个标志立即返回的想法,就是传统的实现方式。
所以,协程适用于所有的异步业务场景。但具体要不要采用是另外的事情。
【 在 ylh1969 的大作中提到: 】
: 这就是典型的卖火车票嘛!
: 选定的车票在数据库被标定为占用,等待你的支付成功的消息,跟线程协程没关系。
: 倒是支付等待回执,确实是个协程,它仅仅就是调用一个RecvNet(),
: ...................
--
FROM 39.144.251.*
确实如此。所以这个世界才会分出多种编程语言。
【 在 z16166 的大作中提到: 】
: 光实现单线程的,会被人骂
: 光实现多线程的,也会被人骂
: 爱用哪种用哪种,不是更好
: ...................
--
FROM 39.144.251.*
以前 DOS GUI 编程的时代可不是啥事件驱动的。while (true) 循环检测是否被按下了某个按键。现在可以被替换成 await key-pressed-event;
我专门弄了一个 eventlet-pyqt 的开源库,还有个 qtng 的开源库。都是为了在 GUI 里面做协程开发。破除了 GUI 编程是异步的这种思维误区。
所有的异步场景都是协程的应用场景。
协程是一种异步函数调用。这是一种抽象。至于用纤程、线程还是进程来实现是不重要的细节。
事实上,c++ 里面可以用 async/await 语法实现一种协程,任务每次都被派发到线程池里面去异步执行。在这种情况下,就根本不使用啥“用户线程“、”纤程“、”绿线程“。
【 在 VincentGe 的大作中提到: 】
: 异步一个典型的模型是回调。是不是非常容易的解决了你的问题。
: 另,GUI编程对数是事件驱动的,没有你这个问题。
: 异步任务是可以取消的。对于一个无副作用的函数,没有区别。
: ...................
--
FROM 39.144.251.*
原来 PySide 和 PyQt 也搞了 asyncio 的模块了啊。我很久不写 pyqt 都不知道。
不过也证明了我十几年前搞的这个 eventlet-pyqt 的先进性哈哈。
你说的是没错的。不管事件循环是单独的还是 while(1) 嵌入到具体的流程里面。都是把异步的事件写成同步的代码。
所以在本系列的帖子里面,大家看到了协程的各种表现形式。这背后有统一的指导思想。
【 在 VincentGe 的大作中提到: 】
: 这个循环本身就是就是 事件循环 ,从本质而言,就是异步模型,但表现上,是同步代码。
: 我刚刚看了eventlet-pyqt库,在最新的qt6.8中,pyqt是可以使用异步的。
: #发自zSMTH@CDU.MP
: ...................
--
FROM 39.144.251.*
给你一个概念辨析:
协程和纤程是啥关系?
c# 代码里面写`await 任务;`会把`任务`丢到线程池去执行,算不算协程?
【 在 VincentGe 的大作中提到: 】
: 对于你后面的说的,协程实质上有两种看法,对应我前面说的部分
: 有人认为协程就是一个local的事件循环,她提供了一个单线程内的同步模型,这个就是所谓的用户线程
: 有人认为协程是一个抽象的task调度器,使得任务在多个线程内并行。
: ...................
--
修改:hgoldfish FROM 39.144.251.*
FROM 39.144.251.*