V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
githmb
V2EX  ›  Kotlin

Kotlin 的协程到底是用来干嘛的?为什么没有可 suspend 的异步 IO 函数?

  •  
  •   githmb · 2023-09-13 11:30:48 +08:00 · 3172 次点击
    这是一个创建于 445 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我还以为会像 Rust 一样把 IO 函数都用异步实现一遍,结果只是把 Job 放到 Dispatchers.IO 线程池里调度,那岂不是该堵塞的还是会堵塞,如果线程池里的所有线程都被堵塞了,剩下的 Job 不就没法执行了,又不是 Go 语言那样的有栈协程可以随时中断,无栈协程就应该用 NIO 实现高 IO 吞吐量啊

    难道说 Kotlin 的协程目前的唯一作用就是让安卓同学不会把 UI 卡死吗?

    11 条回复    2023-09-13 18:55:49 +08:00
    whyrookie
        1
    whyrookie  
       2023-09-13 14:09:49 +08:00
    Kotlin 的协程可以让异步代码写成同步的形式,防止了过多的回调,另外 Job 也是可以取消的。如果仅仅是让 Android 不会把 UI 写死,Kotlin 出现之前,Android 的 UI 也可以不卡死
    kenvix
        2
    kenvix  
       2023-09-13 14:19:37 +08:00
    协程和异步 IO 是两回事,IO 是 JVM 的工作,kotlin 还没有解决好异步 IO 的问题
    Leviathann
        3
    Leviathann  
       2023-09-13 14:52:22 +08:00
    rust 官方也没实现一遍啊?官方甚至都只定义了接口和编译支持,连实现都没做

    go 的随时中断又不是协程的特性,java 的 virtual thread 照样只能主动 yield

    协程的 point 本来就是调度,或者说对计算资源的精细控制,和阻不阻塞完全是正交的关系
    TArysiyehua
        4
    TArysiyehua  
       2023-09-13 15:02:04 +08:00
    原文:异步函数, 答案:suspend fun aaa() = withContext {}
    原文:只是把 Job 放到 Dispatchers.IO 线程池里调度,那岂不是该堵塞的还是会堵塞, 答案:相对于调用线程,因为切换到了其他线程,所以调用线程没有堵塞
    原文:如果线程池里的所有线程都被堵塞了,剩下的 Job 不就没法执行了,答案:如当果协程任务塞满了,会影响协程的执行,但不影响调用线程。默认的 IO 有 64 个,另外也可以手动配置。
    原文:取消,答案:Job 可以取消,但如果是当前任务正在执行确实无法立即取消
    原文:无栈协程就,答案:kotlin 使用了线程栈
    zeni123
        5
    zeni123  
       2023-09-13 15:08:17 +08:00
    堵塞不堵塞和用的系统调用有关, 所以 Java Virtual Thread 把 Socket 用 epoll 重新写了...

    老旧 Apache HttpClient 现在也是 event driven 了
    mmdsun
        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 单机项目可以启动好几百万虚拟线程。
    unco020511
        7
    unco020511  
       2023-09-13 17:38:22 +08:00
    起码 kotlin 协程 for JVM 是你说的这样,一个线程框架,内部原理是状态机+CPS 转换,搭配编译器插件
    Parva
        8
    Parva  
       2023-09-13 18:02:24 +08:00
    我感觉目的还是为了方便线程调度吧
    bringyou
        9
    bringyou  
       2023-09-13 18:03:59 +08:00
    服务端开发的话,可以用 ktor 、okhttp 等框架,它们带的 IO 操作是可以 suspend 的,数据库操作还没很好的解法,可以试试 r2dbc
    lxiian
        10
    lxiian  
       2023-09-13 18:04:14 +08:00 via iPhone
    就是一个线程框架而已,让开发者更好的去使用线程
    superchijinpeng
        11
    superchijinpeng  
       2023-09-13 18:55:49 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2509 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:00 · PVG 13:00 · LAX 21:00 · JFK 00:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.