ForkJoinPool 和 Kotlin 协程
ForkJoinPool and Kotlin Coroutines
据我了解,默认情况下,如果您通过 launch
或 async
启动 Kotlin 协程,它将在 CommonPool
后启动(或者如果您使用 GlobalScope
). CommonPool
是一个 ForkJoinPool
,默认情况下,它处于非异步模式,因此它按 LIFO 顺序执行任务。对于我们想要公平调度的异步 Web 服务器应用程序来说,这似乎是一个非常糟糕的选择:我们不希望先访问我们的 Web 服务器的可怜的傻瓜等待所有后来的调用。
但是,Kotlin 协程在这里增加了一个额外的问题,因为 Kotlin 标准库中有一些代码会安排执行这些协程(据我了解,标准异步 select/epoll 循环的一些变体它)。所以也许后进先出问题不是问题?
我当然可以 运行 进行一些实验 and/or 进入调试器中的代码,看看它是如何工作的,但我怀疑其他人也有同样的问题,我敢打赌有人 "just knows"回答...
这不应该是一个问题,因为 ForkJoinPool
并不是真正的后进先出法。
也就是说,它是池中单个线程的后进先出,但这正是 "work stealing part" 变得有趣的地方。每个线程的任务队列是双链接的。因此,一个线程的 LIFO 是另一个空闲线程的 FIFO。
一般来说,ForkJoinPool 是一个很好的小任务解决方案,如果你明智地使用挂起函数,通常你的协程被认为是小的。
此外,您可以在文档中阅读更多关于 asyncMode
的信息,因为它不是 "async":https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html
asyncMode - if true, establishes local first-in-first-out scheduling
mode for forked tasks that are never joined. This mode may be more
appropriate than default locally stack-based mode in applications in
which worker threads only process event-style asynchronous tasks. For
default value, use false.
根据 Kotlin 讨论上的 discussion CommonPool 不再是默认设置,它们现在默认为 "mostly fair" 调度程序。链接讨论中的详细信息。
据我了解,默认情况下,如果您通过 launch
或 async
启动 Kotlin 协程,它将在 CommonPool
后启动(或者如果您使用 GlobalScope
). CommonPool
是一个 ForkJoinPool
,默认情况下,它处于非异步模式,因此它按 LIFO 顺序执行任务。对于我们想要公平调度的异步 Web 服务器应用程序来说,这似乎是一个非常糟糕的选择:我们不希望先访问我们的 Web 服务器的可怜的傻瓜等待所有后来的调用。
但是,Kotlin 协程在这里增加了一个额外的问题,因为 Kotlin 标准库中有一些代码会安排执行这些协程(据我了解,标准异步 select/epoll 循环的一些变体它)。所以也许后进先出问题不是问题?
我当然可以 运行 进行一些实验 and/or 进入调试器中的代码,看看它是如何工作的,但我怀疑其他人也有同样的问题,我敢打赌有人 "just knows"回答...
这不应该是一个问题,因为 ForkJoinPool
并不是真正的后进先出法。
也就是说,它是池中单个线程的后进先出,但这正是 "work stealing part" 变得有趣的地方。每个线程的任务队列是双链接的。因此,一个线程的 LIFO 是另一个空闲线程的 FIFO。
一般来说,ForkJoinPool 是一个很好的小任务解决方案,如果你明智地使用挂起函数,通常你的协程被认为是小的。
此外,您可以在文档中阅读更多关于 asyncMode
的信息,因为它不是 "async":https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html
asyncMode - if true, establishes local first-in-first-out scheduling mode for forked tasks that are never joined. This mode may be more appropriate than default locally stack-based mode in applications in which worker threads only process event-style asynchronous tasks. For default value, use false.
根据 Kotlin 讨论上的 discussion CommonPool 不再是默认设置,它们现在默认为 "mostly fair" 调度程序。链接讨论中的详细信息。