Kotlin 的协程是真协程吗?被 b 站博主搞蒙了
能做到类似 golang goroutine 完全不阻塞任何 os thread 进行 io 之类的访问并在得到结果后自动把协程挂载到线程继续执行?
视频上说不能: [ [码上开学] 到底什么是「非阻塞式」挂起?协程真的比线程更轻量级吗?-哔哩哔哩] b23.tv/qIkWUmo
协程简单理解就是用同步式的写法去写异步的代码,防止回调地狱。反编译 kotlin 到 java ,本质上还是一层回调嵌套一层回。因此,并不会比线程轻量级。至于你说的,能否实现 golang 的协程效果,完全是可以的,甚至就是为此而设计的。
coroutines 都差不多,算上 js 的,python 的,等等等等。似乎 C#的最早?但是不叫 coroutines
其实就是借助编译器,把函数拆成一个一个的 task ,然后用 event/message loop 来处理
Kotlin 协程在 Jvm 上的实现就是线程,其他平台上的实现不清楚。
stackfull coroutines
Java 能写回调吗?把局部变量的访问全部推到堆上?
不能,kt 协程里不能调用阻塞线程的方法,包括且不仅限于文件 IO ,网络 IO
#5 匿名内部类罢了,所有局部变量都会通过构造函数传到这个内部类里
看最终调用的 io 把
如果在协程里调用阻塞 io 那协程所在的线程还是会被阻塞
如果因为计算任务停住还能靠线程池的任务偷取
go 应该是全链路非阻塞 + 内置调度器,所以可以随便调
go 的协程也会阻塞系统线程啊
只是 Go 的所有 IO 操作被封装过而已,不会直接调用系统 io
和 Kotlin 的效果是一样的,只是 kotlin 的想要不阻塞系统 thread ,需要调用特定 API 而已
协程就是用户态可重入的函数或过程,有的是手动重入比如生成器,有的是自动重入比如 async/await/绿色线程
协程的关键就是用户态的可重入,其他有栈无栈、自动重入手动重入都是基于此的概念
你应该先区分协程和异步IO的关系
kotlin 协程底层并不是回调嵌套,而是基于状态机的递归调用。
go 里面的 io 都是被包装过的,阻塞会自动调度走,kotlin 你用那些包装过的 io 也可以,不然会阻塞跑这个 coroutine 的线程,( cgo 调用系统阻塞 io ,调度器就没辙了)
kotlin for jvm 的协程是包装的线程,非操作系统层级的协程
与协程( coroutine )相对的概念不是线程( thread )、进程( process ),而是子例程( subroutine )
最夸张地说,使用 Kafka Celery 之类的工具作为唯一信道可以构造跨进程甚至跨机器的协程。
至于非阻塞 io ,只是和协程写法非常搭配罢了。但你也可以用 ponylang 那样的纯消息模式。
kotlin 语言层面定义了一次性续延( one time continuation ),在那基础上构建的协程,我不认为编译到回调链能够正确地实现之,尤其是涉及控制结构(条件 / 循环)的时候。
我记得是很早就能写了(看到写 stream 的都写回调)。不过蕴含一个障碍,不能直接修改外层词法作用域的变量,必须使用容器类型,我认为这符合 #7 所说。
如果是系统调用应该还是会占用线程的
难道还有操作系统层级的协程?协程本来就是应用自己实现的
操作系统哪来的协成概念, 所有协程的概念都是语言提供的, go 是 runtime 层面直接提供, kotlin 则是一个统一的抽象, 在不同的 runtime 上提供不同的实现, 基本上都是翻译成状态机的实现
协程是协程,异步 IO 是异步 IO 。。
# 18 是吗,那可能是我理解错了吧
今天搜索突然搜到个 javashuo.com 点开一看是和之前卡饭一样的套路,再加采集,特别容易出现在搜索结果里 () machbbs (.) com/v2ex/ 这个更牛…
为啥国内不少 app 需要手机端发送短信过去反向验证,不能直接验证码登录 省钱 没遇到过这种 app.有可能是怕被刷短信端口吧 防黑产买一次性手机号 发短信还算好的了,…
苹果有统一的推送 APNs,下发通知很方便, 请问微软最新的[win10/win11]有这种类似的统一推送服务吗? win 开机启动个微信或者 qq 就可以了,又没有墓碑机制…