【问题标题】:Coroutines limits?协程限制?
【发布时间】:2020-05-01 08:39:28
【问题描述】:

我有一些关于协程的问题:我可以同时启动大量工作繁重的协程吗?

例如,我有一个对象列表,我想为每个对象做一些繁重的工作。

  • 我可以做一个for 循环并一次性为每个对象启动一个协程吗?
  • 协程如何并行处理大量工作?
  • 如果内存太低,协程会等待再启动另一个协程?
  • 例如,最好使用 newFixedThreadPoolContext 来限制协程?

【问题讨论】:

    标签: android performance kotlin kotlin-coroutines


    【解决方案1】:

    我可以在繁重的工作中启动大量协程吗? 并行?

    是的,你可以。 Coroutines 真的很轻量级。事实上,很多协程示例表明您可以一次启动数千个协程。

    我可以做一个 For 循环并在一次为每个对象启动一个协程吗 ?

    是的,你可以。虽然我不知道那会有多高效。

    协程如何并行处理大量工作?

    协程具有Dispatchers 的概念,允许您配置线程。

    如果内存太低,协程会等待再启动另一个 协程?

    协程的行为类似于轻量级Threads,因此内存管理取决于您。我不知道如果系统没有足够的内存时会阻止启动协程的内置机制。同样,协程是轻量级的,因此如果您无法启动协程,则可能出现问题。

    最好使用 newFixedThreadPoolContext 来限制协程 例子?

    通过使用newFixedThreadPoolContext,您并没有真正限制可以启动的协程数量。您只是在为启动协程而创建的 ThreadPool 上实施限制。同样来自newFixedThreadPoolContextdocs请注意,将来会被替换。

    【讨论】:

    • 感谢您的回答!另一个问题,如果我必须做一些繁重的工作,例如对图像列表进行图像处理。是一次启动一个协程,还是同时启动所有协程更好?
    • 这真的取决于你想要做什么。
    • 只要每个元素的 wokload 大于一毫秒左右,您就可以为每个元素启动一个协程。对于较轻的工作,您应该使用批处理,因为在线程之间切换工作会产生开销。
    • 感谢两位的回答。是的,按元素计算需要超过一毫秒。
    猜你喜欢
    • 2023-01-03
    • 2015-03-08
    • 1970-01-01
    • 2018-05-21
    • 2022-07-05
    • 1970-01-01
    • 2016-01-26
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多