gpt4 book ai didi

android - "light-weight"协程如何真正适用于真实世界的 Android 开发?

转载 作者:行者123 更新时间:2023-12-02 12:40:21 24 4
gpt4 key购买 nike

当您开始了解 Kotlin 协程时,您看到的第一个示例是可以启动数十万个协程,但在使用线程尝试同样的事情时会遇到 OutOfMemory 异常。

虽然这个例子很“酷”,但我认为它对实际的 Android 应用程序开发没有用,甚至有点误导。当然,您可以启动数十万个除了 delay() 之外什么都不做的协程,但实际上,您要么启动执行某种 IO 或某种计算的协程。

例如,如果你启动了数十万个协程,并且每个协程都使用 Retrofit 执行一个网络请求,那么它不会比没有协程的常规使用 Retrofit 更轻量级,因为 okhttp 仍然会为每个请求阻塞一个线程。

在协程中进行计算时也是如此。然后它也不是更轻量级,因为正在进行计算的线程在完成之前会被阻塞。

那么我的假设是否正确,如果没有非阻塞 IO 库的存在,我的应用将不会仅通过使用协程变得更高效或“轻量级”,还是我遗漏了什么?

最佳答案

Sure, you can start hundreds of thousands of Coroutines that do nothing but delay(), but in reality, you either start coroutines that do some kind of IO or some kind of calculations.

不一定。协程也可用于重组其他类型的代码,例如 working with views .

If you, for instance, start hundreds of thousands of Coroutines and each performs a network request with Retrofit, it wouldn't be any more lightweight than using Retrofit conventionally without Coroutines, because okhttp still blocks a thread for each request.

我猜你是想说 OkHttp 使用线程池。确实如此。

The same is true when you are doing calculations in coroutines. Then it is also not more lightweight, as the threads which are doing the calculations are blocked until they have finished.

这是您原始段落中的 OutOfMemoryError 场景,如果您为每个计算创建单独的线程。

协程调度器基于线程池。 RxJava 调度程序也是如此。 AsyncTask 也是如此。 “几十万个Coroutines”的场景,最终还是比较了不用线程池和用了线程池。所以,是的,“数十万个协程”的比较并不显着,因为还有其他使用线程池的方式。

关于android - "light-weight"协程如何真正适用于真实世界的 Android 开发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61654349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com