代码之家  ›  专栏  ›  技术社区  ›  Oliver Dain

ForkJoinPool和Kotlin协同程序

  •  0
  • Oliver Dain  · 技术社区  · 7 年前

    launch async 它会在 CommonPool (或者如果你使用 GlobalScope ). 以及 公共泳池 ForkJoinPool 默认情况下,它处于非异步模式,所以它按后进先出的顺序执行任务。对于我们希望公平调度的异步web服务器应用程序来说,这似乎是一个非常糟糕的选择:我们不希望那些先访问我们的web服务器的可怜虫等待随后的所有调用。

    然而,Kotlin协程在这里增加了一个额外的缺陷,因为Kotlin标准库中有一些代码将安排执行这些协程(我理解的标准asycelect/epoll循环的一些变体)。那么,后进先出的问题也许不值得关注?

    我当然可以运行一些实验和/或在调试器中单步执行代码,看看这是如何工作的,但我怀疑其他人也有同样的问题,我打赌有人“只知道”答案。。。

    0 回复  |  直到 7 年前
        1
  •  2
  •   Oliver Dain    7 年前
        2
  •  0
  •   Alexey Soshin    7 年前

    这不应该是个问题,因为 ForkJoinPool 不是真正的后进先出。

    也就是说,对于池中的一个线程,它是后进先出,但这就是“工作窃取部分”的有趣之处。每个线程的任务队列都是双向链接的。所以,一个线程的后进先出是另一个空闲线程的先进先出。

    另外,你可以阅读更多关于 asyncMode 在文档中,并不是“异步”: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html

    asyncMode-如果为true,则建立本地先进先出计划 从未连接的分叉任务的模式。这种模式可能更多 适用于中的应用程序中的默认本地基于堆栈的模式 哪个工作线程只处理事件样式的异步任务。为 默认值,使用false。