JVM 上的协程,真香

2018-12-05 16:25:13 +08:00
 sagaxu
尝试把一个 API 从 Future 重构成了 coroutine,代码行数减少很多,代码逻辑也更清晰易懂了。同步的代码写起来流畅多了,又少了一个用 go 的理由。
10413 次点击
所在节点    程序员
46 条回复
cpdyj0
2018-12-05 21:49:25 +08:00
诶呀终于有这个功能了
@sagaxu
loqixh
2018-12-05 21:51:47 +08:00
c#用了多少年了, 你们才后知后觉. 还一直嘲笑 c#糖多太甜
liuminghao233
2018-12-05 22:09:30 +08:00
c++早就用上了(
janxin
2018-12-05 22:13:11 +08:00
Kotlin 的 coroutine 还是和 go 的 goroutine 使用场景上不一样的。coroutine 本质上是调度,一些该 block 的操作还是 block 的。如果需要继续提升更高的性能,还是需要做 go 底层类似的异步转同步优化。这样改下来性能应该会比 go 更高。
janxin
2018-12-05 22:15:25 +08:00
另外支持 Kotlin 干死 Java,嗯嗯
garfeildma
2018-12-05 22:54:48 +08:00
@sagaxu 之前看 so 上 kotlin coroutines 作者解释过,kt 也是 stackful 的
Tyanboot
2018-12-05 23:15:33 +08:00
@keepeye
@sagaxu

kt + vertx 的情况下,kt 的协程是依靠 vertx 的线程池来调度的,然后 vertx 的一个实例还有 context 线程池和一个 worker 线程池,正常的代码都在 context 线程池上跑,包括协程也是。worker 线程池是在 executeBlocking 的时候用到的。这两个线程池默认好像是 4+8 吧。
sagaxu
2018-12-05 23:51:53 +08:00
@garfeildma 你可能记错了,Kotlin 的协程实现是 continuation-passing style,内部是个状态机。
简介可以看他们 teamleader 的 ppt
https://www.slideshare.net/elizarov/introduction-to-kotlin-coroutines


@Tyanboot vertx 一个 instance 对应一个线程,线程数开到 4,如果 instance 小于 4,比如是 1,只能占用一个 CPU 核心。

@taowen putty 代码里就有 coroutine 的状态机实现,其实用不了几行代码。

@reus 如果都是 vertx 代码还好,可以无缝的跟协程一起用,海量的多线程阻塞代码是个问题。
reus
2018-12-06 00:05:42 +08:00
@sagaxu 协程的通病了,和现有使用系统线程的多线程程序不容易配合。go 就没有这个问题,因为从一开始大家都是用 goroutine 的
youngxhui
2018-12-06 07:58:52 +08:00
听说 Java 现在内部也在实现协程,估计在日后的某个 JDK 版本内就有了🤔
fan123199
2018-12-06 08:53:40 +08:00
kotlin 才是现代语言。go 实在是有点原始,写个“列表中是否包含某个元素”都要写个 util。由于不支持泛型,每个类又要写一遍。
loqixh
2018-12-06 09:07:17 +08:00
@reus goroutine 用底层 hack 的方式调度, 坑太多了, 时不是要注意调度问题. 像 c#一样全库异步化才是出路
reus
2018-12-06 09:15:39 +08:00
@loqixh 例如什么坑? C#没有出路,过去没有,现在没有,以后也不会有。
2225377fjs
2018-12-06 09:29:35 +08:00
stackless 的协程现在变成了优势了。。?
Narcissu5
2018-12-06 09:40:00 +08:00
@reus 我觉得技术上的出路和普及度上的出路要分开看。Java 继续作死 C#未必没有机会,Service Mesh 也是个翻身的机会
sagaxu
2018-12-06 09:53:01 +08:00
@youngxhui loom 进 jvm 并且能用于生产环境,至少要到 java 17 了
@fan123199 go2 一两年内应该能出来了,go 是现代 c 语言,不是现代语言
@2225377fjs stackless 和 stackful 各有优劣,stackless 胜在轻量,轻到可以用它做 generator,但是调用开销比 stackful 稍大。
@Narcissu5 C#有没有机会,就看 flag 和 bat 用的多不多,未来十年大部分互联网公司的技术骨干,多半是这些大厂输出的。
garfeildma
2018-12-06 10:02:51 +08:00
@sagaxu 主要是对 stackless 和 stackful 没有一个明确的定义,可以看看这个答案下边 Roman 的回复 https://stackoverflow.com/a/43023289/220029
garfeildma
2018-12-06 10:04:16 +08:00
@youngxhui Project Loom 吧,原来 Quasar 的作者在负责,不过听说阿里的 JDK 里边已经内置协程了
slince
2018-12-06 10:25:23 +08:00
go 里一个关键词搞定的事情,java 要写一个类;是不是有线程伪装的协程都要存个疑
loqixh
2018-12-06 10:52:00 +08:00
@reus 多用点你就知道了, go 我也是写个几个玩具的, 具体懒得说

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

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

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

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

© 2021 V2EX