- 主题:终于想明白协程了。
哈哈。。对,就是这样。。
通常需要一个事件循环来调度协程。我是给 python 的 eventlet 写了一个插件,让 pyqt 程序也可以用协程发起网络请求的时候才悟到这个道理的。
【 在 speedboy2998 (极品飞车) 的大作中提到: 】
: 不得不说,人的思维定式还是很害人。
: 我当年毕业的时候,多线程还不普及,我狠下功夫研究了IOCP以及EPOLL,当时的EPOLL都还没有正式进入LINUX内核,需要自己编译内核来支持。整个公司的一套通讯平台底层基础库就是我封装的,对业务层提供统一接口,底层分别支持IOCP和EPOLL(和ASIO一个思想),我当时对多线
: 现在遇到协程,我发现我也死活理解不了这玩意儿,不由得哀叹自己老了。但是突然有一天一下子明白了,协程和线程核心区别其实就是:线程是内核创建并调度的,内核根据算法来pause/resume某个线程,线程中的代码随时都可能被内核pause,过一会儿又回来从之前pause的地方接
: ...................
--
FROM 112.47.122.*
因为 c++20 加了协程吧。。
不过这东东用了真是会上瘾。
我用协程 + Qt 写网络程序的客户端。比以前方便清晰了很多。
【 在 cn62 (cn62) 的大作中提到: 】
: 为啥最近这么多人搞协程?
: ASIO文档有几个用协程的例子挺不错的。
--
FROM 125.78.66.*
当时的协同式多任务比现在的先进,因为当时是隐式的,GetMessage() 阻塞的时候跳到 windows 内核。而现在 cpp/python/c# 搞的协程都是显式的,程序员需要写:
await sendTcpData();
或者
async for progress in sendTcpData():
print(progress)
async/await 这两个关键字会到处传播。比以前还落后了。
【 在 lvsoft (Lv(The Last Guardian)) 的大作中提到: 】
: 老什么老,你理解不了协程就是因为你不够老。
: 当年windows3.x时代有个名词,叫协同式多任务,
: 到了win95又有个词,叫抢占式多任务。
: ...................
--
FROM 112.47.122.*
显式标示协程是为了兼容现有的生态环境。如果默认所有的 IO 操作都是协程的跳转,那 async/await 就没意义了。。
我看比较新的 python 里面一堆 await/async 觉得很恶心。
【 在 somebody (??) 的大作中提到: 】
: 那时候不需要程序员管,但是一有bug就把操作系统塞死,现在程序员控制只能搞死自己的程序。
: 我觉得显式控制还是更好的
--
FROM 125.78.66.*
这个还是小事。。
在调用之间是有状态的。想要维护这个状态,用 promise 回调就得这么干:
auto context = make_shared<map<string, variant>>();
promise.then([context] {
context->insert("what", 1);
then....else....
}).else([context] {});
必须要有一个 context 数据块传来传去,非常的麻烦。
【 在 eematlab (一辰未冉) 的大作中提到: 】
: promise的链式调用也很烦
: Promise.resolve()
: .then(() => {
: ...................
--
FROM 125.78.66.*
规定协程只在一个线程里面使用就行了。
【 在 ylh0315 的大作中提到: 】
: 多线程协程,最难的是协程锁。
: 程序运行到IO,等IO完成,就换了一个线程。IO之前的线程锁统统找不到了。
: 我也没解决这个问题。只能告诫使用者线程锁不可以跨越IO。
: ...................
--
FROM 183.253.147.*
确实如此。但神奇的是这么好用的东东。业界花了三十年还没普及。
【 在 lvsoft 的大作中提到: 】
: 协程这个概念刚抛出来的时候我一看就知道这不过是win3.x时代的协同式多任务的旧瓶装新酒而已。
: 蚐OCKET了解得特别透彻,也非常不明白为啥很多人不理解多线程。
: 葱校琾rogrammer 不用管什么时候代码被暂停执行,什么时候被恢复执行。
: ...................
--
FROM 183.253.147.*
不奇怪啊。因为 c++20 的协程不是给应用层的程序员用的,而是给程序库作者设计的。非常的底层,必须包装过一层才能用。
【 在 ysheshang 的大作中提到: 】
: 对,2天有点夸张了,其实就是还没有上实际项目,记不住也很正常。
--
FROM 223.73.60.*