gpt4 book ai didi

kotlin - 如何在 Kotlin 协程中使用异步缓存?

转载 作者:行者123 更新时间:2023-12-02 12:38:25 29 4
gpt4 key购买 nike

我有一个使用协程的 Kotlin JVM 服务器应用程序,我需要在非阻塞网络调用前面放置一个缓存。我想我可以使用咖啡因 AsyncLoadingCache 获得我需要的非阻塞缓存行为。 AsyncCacheLoader 我需要实现的接口(interface)使用 CompletableFuture .同时,我要调用的加载缓存条目的方法是 suspend功能。

我可以像这样弥合差距:

abstract class SuspendingCacheLoader<K, V>: AsyncCacheLoader<K, V> {
abstract suspend fun load(key: K): V

final override fun asyncLoad(key: K, executor: Executor): CompletableFuture<V> {
return GlobalScope.async(executor.asCoroutineDispatcher()) {
load(key)
}.asCompletableFuture()
}
}

这将运行 load提供的 Executor上的功能(默认情况下, ForkJoinPool ),从咖啡因的角度来看,这是正确的行为。

但是,我知道我应该尝试 avoid using GlobalScope to launch coroutines .

我考虑让我的 SuspendingCacheLoader实现 CoroutineScope 并管理自己的协程上下文。但是 CoroutineScope旨在由具有托管生命周期的对象实现。无论是缓存还是 AsyncCacheLoader有任何生命周期钩子(Hook)。缓存拥有 ExecutorCompletableFuture实例,因此它已经以这种方式控制了加载任务的生命周期。我看不出让协程上下文拥有任务会添加任何东西,而且我担心在缓存停止使用后我将无法正确关闭协程上下文。

编写自己的异步缓存机制非常困难,所以如果可以的话,我想与 Caffeine 实现集成。

正在使用 GlobalScope实现的正确方法 AsyncCacheLoader ,还是有更好的解决方案?

最佳答案

The cache owns the Executor and the CompletableFuture instances, so it already controls the lifecycle of the loading tasks that way.



这不是真的, Caffeine 上的文档指定它使用用户提供的 ExecutorForkJoinPool.commonPool()如果没有提供。这意味着没有默认的生命周期。

不管直接调用 GlobalScope似乎是错误的解决方案,因为没有理由对选择进行硬编码。只需提供 CoroutineScope通过构造函数并使用 GlobalScope作为一个参数,而您没有明确的生命周期供缓存绑定(bind)。

关于kotlin - 如何在 Kotlin 协程中使用异步缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55270732/

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