gpt4 book ai didi

java - `kotlinx.coroutines.withContext` 与 Spring WebFlux 一起使用是否安全?

转载 作者:行者123 更新时间:2023-12-04 03:23:35 25 4
gpt4 key购买 nike

想象一下,我有一个使用 Kotlin 实现的 Spring WebFlux Controller ,它看起来像这样:

@RestController
@RequestMapping("/api/foo")
class MyController {
@GetMapping
suspend fun getFoo(): FooResource {
return withContext(Dispatchers.IO) {
// fetch some resource with some expensive blocking IO call
}
}
}
我理解 WebFlux 的并发模型的方式是,只有一个线程可用于处理请求,所以如果我由于某种原因无法避免阻塞 IO 调用,我需要以某种方式将其卸载到另一个线程。 kotlinx.coroutines.withContext助手应该就是这样做的,使用 IO dispatcher 是专门为这样的用例设计的。`我在几篇博客文章中看到过这种模式,所以它似乎是常识。
但是,[关于 Dispatchers.IO 的文档|说:

This dispatcher shares threads with a Default dispatcher, so using withContext(Dispatchers.IO) { ... } does not lead to an actual switching to another thread — typically execution continues in the same thread. As a result of thread sharing, more than 64 (default parallelism) threads can be created (but not used) during operations over IO dispatcher.


所以这让我想知道:如果 WebFlux 只使用一个“主线程”来处理请求,并且即使我正在使用 withContext(Dispatchers.IO),阻塞 IO 仍然可能发生在这个线程中。 : 这个模式是否可以安全使用,如果不安全,我还应该怎么做?

最佳答案

是的,安全,你懂的withContext正确。
你在这里提到的那篇文档只是谈到了对 Dispatchers.IO 的优化。在 IO 之间切换时和 Default调度程序(避免上下文切换)。
使用 withContext(Dispatchers.IO)来自除 Default 之外的其他线程/IO线程池将正确(并且始终)将上下文切换到该 IO 线程池,根据需要启动新线程来处理阻塞 IO,因此这应该是您的情况。

关于java - `kotlinx.coroutines.withContext` 与 Spring WebFlux 一起使用是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68069529/

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