- 主题:stackoverflow 有个比较 c++ stackful 和 stackless 协程的帖子
当然。这问题已经解决。实际上不是用协程,而是用接续模式。
N个响应都去处理一个计数器,计数器到0任务完成。也可以有超时完不成的,都能处理。
【 在 wallyz 的大作中提到: 】
: 提醒一下,五个响应回来的顺序不一定
:
--
FROM 221.218.61.*
论坛上讨论问题,不要总是试图显得自己无所不知无所不能
我难道不会用计数器和switch嘛
我原话说的不就是,如果用协程处理这个问题,不优雅吗?
【 在 ylh0315 的大作中提到: 】
: 当然。这问题已经解决。实际上不是用协程,而是用接续模式。
: N个响应都去处理一个计数器,计数器到0任务完成。也可以有超时完不成的,都能处理。
--
FROM 113.120.108.*
最后一个很容易。各个语言都会提供一个 when(), all(), map() 之类的函数。使用方式大概是这样:
async function pow2(i) {
resp = await http.post(url, {"i": i});
return resp.json()["result"];
}
let to_process = [...Array(10).keys()]
let results = Coroutine.map(pow2, to_process);
console.debug(results);
这里就会打印出使用 http 接口获得的平方序列。
【 在 wallyz 的大作中提到: 】
: 我的朴素理解:
: 协程就是内嵌数据、自带可更新的状态、可根据当前状态和数据恢复/继续执行的一个东西
: 至于是用栈,还是用另外的某种数据结构(比如一个很另类的类)来实现这个东西,理论上都是可以的
: ...................
--
FROM 110.81.0.*
忽然想到了Promise
有种说法js中每个async返回的是一个promise
rust是每个async返回future
【 在 hgoldfish 的大作中提到: 】
: stackful 协程是指之前 boost 里面实现的 boost.context, boost.fiber 等等协程方案。基本原理是保存寄存器、jmp指令、恢复寄存器。
: 而 stackless 协程是指 c++20 实现的 co_await, co_yield 这个语法。它把协程的代码变换成为另外一段 c++ 的类型,类似于 lambda 那样继承一个专门的协程类型,然后调用它的方法。
: 这里写出了两种协程的对比。
: ...................
--
修改:gfkid FROM 124.64.17.*
FROM 124.64.17.*
各个语言的协程都会有一个类型来处理,比如 python 就直接叫 coroutine 类型,里面有:
send()/throw() 对应 javascript new Promise() 回调的 resolve()/reject()
【 在 gfkid 的大作中提到: 】
: 忽然想到了Promise
: 有种说法js中每个async返回的是一个promise
: rust是每个async返回future
: ...................
--
FROM 183.253.146.*
迭代器或者 stackless 协程,内部都会生成一个 context,这个不算闭包吧?
【 在 gfkid 的大作中提到: 】
: generator和closure很像啊
: 或者说迭代器是闭包的一个典型用法吧
--
FROM 183.253.146.*
这三个是不同的概念,但可以组合起来用
Coroutines, closures and continuations
https://blogs.igalia.com/vjaquez/2008/10/09/coroutines-closures-and-continuations/
generator有yield,肯定是一个coroutine,
generator通常也是一个closure(使用了free variable时)
也就是一般情况下 generator = coroutine + closure
【 在 gfkid 的大作中提到: 】
: generator和closure很像啊
: 或者说迭代器是闭包的一个典型用法吧
--
修改:z16166 FROM 114.240.244.*
FROM 114.240.244.*
我是在同意你的意见,也说了,最后没有用协程解决这个问题,后来想起来的,好几年前的事了。
如果引起你的不快,请包涵。
【 在 wallyz 的大作中提到: 】
: 论坛上讨论问题,不要总是试图显得自己无所不知无所不能
: 我难道不会用计数器和switch嘛
: 我原话说的不就是,如果用协程处理这个问题,不优雅吗?
: ...................
--
FROM 221.218.61.*