Kotlin 的协程实现的意义是什么呢?

2020-03-20 23:30:14 +08:00
 insomnia1232

看了 kotlin 的协程实现,感觉就是线程调度库,换句话说就是伪协程,那和 Rxjava 这种东西的区别在哪呢?是切换效率更高,写起来更简洁吗?还是就因为是官方钦定的

7079 次点击
所在节点    Kotlin
31 条回复
reus
2020-03-21 12:44:39 +08:00
@qiyuey 这是字眼上的区别???不同概念就是不同概念,自己没搞清楚就说别人抠字眼???不存在什么广义协程协程,只有正确理解和错误理解。
no1xsyzy
2020-03-21 13:26:31 +08:00
@abcbuzhiming 查了下,“用户态的轻量级多线程” 应该叫 “纤程” 而不是 “协程”,协程和线程是相互正交的两种概念。
yule111222
2020-03-21 13:43:10 +08:00
就是写起来简单点,确实是伪协程
no1xsyzy
2020-03-21 13:44:34 +08:00
协程的定义是用 yield 来主动交出控制权,具体的执行器到底有几个是不确定的。

引入协程式语法并不需要线程调度,转换 CSP 之后 yield 实质上把续延当作 callback 传递不就行了?写还是写类似同步的。
不过既然没有引入续延那就是这样封装一把容易(得多得多)。
sagaxu
2020-03-21 13:50:46 +08:00
@hhhsuan 你的感觉是错的
qiyuey
2020-03-21 15:19:05 +08:00
@hhhsuan 你的感觉并不对
hhhsuan
2020-03-21 15:29:33 +08:00
@sagaxu #25
@qiyuey #26
show me the code
Tyanboot
2020-03-22 02:30:06 +08:00
@hhhsuan #17 如果不用切换线程的话, 那 launch(Executors.newSingleThreadExecutor().asCoroutineDispatcher()) 是否符合呢. launch 的时候选择用单线程的调度器, 也就没有线程切换的问题了吧.

@no1xsyzy #24 另外如果定义可以用类似 yield 的方式来交出控制权的话, 那 kt 同样提供了 suspendCoroutine 和 suspendCancellableCoroutine 的方式来暂停, 并提供一个 Continuation 对象来供恢复. 这就和 Rust 的 Future 设计是差不多的意思.
araaaa
2020-03-22 09:38:28 +08:00
将函数式代码转为命令式,减少嵌套提高可读性
no1xsyzy
2020-03-23 00:46:55 +08:00
@Tyanboot 实际上我刚花了半小时看了下 kotlin 语法(
感觉是 delay 之类的阻塞操作隐式交出控制权这样。隐式是可以的。
suspendCoroutine 没看太看明白……
用法大概是
launch {
// doSomething
passed_value = suspendCoroutine( continuation -> some_global_variable = continuation)
// after continued
}
launch {
// doSomething
some_global_variable.resume(pass_value)
// not reachable
}
这样?那其实就是做了个 first-class continuation (虽然这个 continuation 是个一次性的,到底算不算 first-class 我也不知道),并且把逃逸路线控制在 launch 上吧…… 怎么说…… 挺原汁原味的……
Tyanboot
2020-03-23 18:45:05 +08:00
@no1xsyzy 大概就是这样的用法, 不过 resume 的时候不需要放在 launch 里面, 毕竟 launch 只是用来启动一个协程的, kotlin 把这玩意叫可暂停的函数罢了。

delay 这个函数就长这样

suspend fun delay(timeMillis: Long) {
if (timeMillis <= 0) return
return suspendCancellableCoroutine sc@ { cont: CancellableContinuation<Unit> ->
cont.context.delay.scheduleResumeAfterDelay(timeMillis, cont)
}
}

里面也是直接调用了 suspendCancellableCoroutine 来暂停的. 这样很多阻塞操作用户看来感觉就像是隐式的, 其实都是函数调用链里面某一层显式的用了 suspend*Coroutine 来暂停的,包括什么 channel 的 receive,mutex 的 lock 之类的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/654737

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX