现在 Kotlin Coroutine 库已经稳定版本,已经出现了很多采用 Coroutine 来重构过去的 RxJava 等异步库的实践,比如 Retrofit 请求使用 Deferred 返回 这些 Coroutine 实践是对异步代码的一个调用模型的改善,callback-> stream -> sequential 的变化。对代码可读性进行了改善。
而 协程 这个概念还有另一个意图,就是减少线程切换开支,在同一个线程里进行 IO 操作,比如 Python Async 用于爬虫的并发 Http 请求方面,在同时发起巨大数量的 Http 请求时,可以创建的协程数量远远高于线程,在同样数量的并发情况下,降低内存的用量和线程的切换开销(实际并没有提高速度,IO 速度才是瓶颈), Python 协程这一特点,得益于“异步 io ”: asyncio,如果使用 requests.get() 这种阻塞请求,是达不到效果的。
回到 Kotlin 的协程,它加入了多线程切换,也就是调度器会把协程分发到不同的线程去跑,这个特性非常好,使用协程也利用了多线程。但问题是,Kotlin 现在没有 “ asyncio ” 这样的机制,也就是说,我没办法在一个线程内发起 n 个协程进行并发 n 个请求,若然,并发其实也是多线程的,也会占很大的线程资源。
所以我的问题是 Kotlin Coroutine 偏向于解决异步编码模型,而不是异步 io 资源的利用效率;而 Python asynio 则偏向于解决异步 io 资源的利用效率( GIL 的存在)?(或许我应该对比 JavaScript? :D)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.