我还以为会像 Rust 一样把 IO 函数都用异步实现一遍,结果只是把 Job 放到 Dispatchers.IO 线程池里调度,那岂不是该堵塞的还是会堵塞,如果线程池里的所有线程都被堵塞了,剩下的 Job 不就没法执行了,又不是 Go 语言那样的有栈协程可以随时中断,无栈协程就应该用 NIO 实现高 IO 吞吐量啊
难道说 Kotlin 的协程目前的唯一作用就是让安卓同学不会把 UI 卡死吗?
1
whyrookie 2023-09-13 14:09:49 +08:00
Kotlin 的协程可以让异步代码写成同步的形式,防止了过多的回调,另外 Job 也是可以取消的。如果仅仅是让 Android 不会把 UI 写死,Kotlin 出现之前,Android 的 UI 也可以不卡死
|
2
kenvix 2023-09-13 14:19:37 +08:00
协程和异步 IO 是两回事,IO 是 JVM 的工作,kotlin 还没有解决好异步 IO 的问题
|
3
Leviathann 2023-09-13 14:52:22 +08:00
rust 官方也没实现一遍啊?官方甚至都只定义了接口和编译支持,连实现都没做
go 的随时中断又不是协程的特性,java 的 virtual thread 照样只能主动 yield 协程的 point 本来就是调度,或者说对计算资源的精细控制,和阻不阻塞完全是正交的关系 |
4
TArysiyehua 2023-09-13 15:02:04 +08:00
原文:异步函数, 答案:suspend fun aaa() = withContext {}
原文:只是把 Job 放到 Dispatchers.IO 线程池里调度,那岂不是该堵塞的还是会堵塞, 答案:相对于调用线程,因为切换到了其他线程,所以调用线程没有堵塞 原文:如果线程池里的所有线程都被堵塞了,剩下的 Job 不就没法执行了,答案:如当果协程任务塞满了,会影响协程的执行,但不影响调用线程。默认的 IO 有 64 个,另外也可以手动配置。 原文:取消,答案:Job 可以取消,但如果是当前任务正在执行确实无法立即取消 原文:无栈协程就,答案:kotlin 使用了线程栈 |
5
zeni123 2023-09-13 15:08:17 +08:00
堵塞不堵塞和用的系统调用有关, 所以 Java Virtual Thread 把 Socket 用 epoll 重新写了...
老旧 Apache HttpClient 现在也是 event driven 了 |
6
mmdsun 2023-09-13 15:48:58 +08:00
解决地域回调问题,简化安卓开发。
说到操作系统异步 IO ,POSIX AIO 上实现得不够完善和高效。io_uring 又是高版本内核才支持。 异步 IO 只能在 Windows 上玩。主流 epoll 那套也不是异步 IO Java 虚拟线程适合大部分时间被阻塞、等待 I/O 操作的任务,网络请求或磁盘读写。虚拟线程遇到阻塞 I/O 时,JVM 会将其挂起,与之关联的操作系统线程可以为其他虚拟线程提供服务。能大幅度提高 I/O 吞吐量和并发性能,Java 单机项目可以启动好几百万虚拟线程。 |
7
unco020511 2023-09-13 17:38:22 +08:00
起码 kotlin 协程 for JVM 是你说的这样,一个线程框架,内部原理是状态机+CPS 转换,搭配编译器插件
|
8
Parva 2023-09-13 18:02:24 +08:00
我感觉目的还是为了方便线程调度吧
|
9
bringyou 2023-09-13 18:03:59 +08:00
服务端开发的话,可以用 ktor 、okhttp 等框架,它们带的 IO 操作是可以 suspend 的,数据库操作还没很好的解法,可以试试 r2dbc
|
10
lxiian 2023-09-13 18:04:14 +08:00 via iPhone
就是一个线程框架而已,让开发者更好的去使用线程
|
11
superchijinpeng 2023-09-13 18:55:49 +08:00
|