Kotlin 中的对象池
ObjectPool in Kotlin
我想在 Kotlin 中使用对象池,并且更喜欢类似于 apache commons pool 的开源库。我不使用 apache 公共池的唯一原因是它的借用方法是阻塞的。我想要一个具有以下功能的游泳池
- 设置 maxIdle 对象
- 清理闲置时间过长的对象
- 创建对象直到达到池容量(如果有更多需求)
- 不允许用户泄露对象
我在互联网上搜索了想法,this implementation 非常非常接近我想要的。我不使用的原因是它是基于实验API。我也不高兴我需要启动一个无限循环来处理对象借用和回收,因为如果这个循环失败,整个池就死了。我更喜欢方法 borrow()
和 recycle()
是根据对象的需求执行的。
最后看了Ktor中实现的ObjectPool,但是没看懂borrow和recycle是怎么实现的。有人可以解释一下 pushTop()
和 popTop()
方法是如何工作的,或者只是指出有关此处应用的概念的正确文献。如果我能弄清楚借用和回收方法的工作原理,我想我可以采用这个。
那么我的问题是什么?
- 如何采用 Ktor 的
DefaultObject
池来实现上述目标
只是让 Commons Pool 提供暂停借用方法的想法。我没有花很多时间对此进行推理,所以我不能保证它完全有道理。但我的想法是,既然它已经尝试按照线程请求对象的顺序解除阻塞,那么让所有请求进入同一个线程应该没问题,协程将按照请求的顺序接收它们的对象。因此,您可以将单个线程分配器附加到单个池。缺点是它最终会短暂地挂起以交换线程,即使池没有用完也是如此。
class SuspendingObjectPool<T>(private val sourcePool: ObjectPool<T>) : ObjectPool<T> by sourcePool {
private val dispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
suspend fun borrowObjectSuspending(): T = withContext(dispatcher) { borrowObject() }
}
fun <T> ObjectPool<T>.asSuspendingObjectPool() = SuspendingObjectPool(this)
我想在 Kotlin 中使用对象池,并且更喜欢类似于 apache commons pool 的开源库。我不使用 apache 公共池的唯一原因是它的借用方法是阻塞的。我想要一个具有以下功能的游泳池
- 设置 maxIdle 对象
- 清理闲置时间过长的对象
- 创建对象直到达到池容量(如果有更多需求)
- 不允许用户泄露对象
我在互联网上搜索了想法,this implementation 非常非常接近我想要的。我不使用的原因是它是基于实验API。我也不高兴我需要启动一个无限循环来处理对象借用和回收,因为如果这个循环失败,整个池就死了。我更喜欢方法 borrow()
和 recycle()
是根据对象的需求执行的。
最后看了Ktor中实现的ObjectPool,但是没看懂borrow和recycle是怎么实现的。有人可以解释一下 pushTop()
和 popTop()
方法是如何工作的,或者只是指出有关此处应用的概念的正确文献。如果我能弄清楚借用和回收方法的工作原理,我想我可以采用这个。
那么我的问题是什么?
- 如何采用 Ktor 的
DefaultObject
池来实现上述目标
只是让 Commons Pool 提供暂停借用方法的想法。我没有花很多时间对此进行推理,所以我不能保证它完全有道理。但我的想法是,既然它已经尝试按照线程请求对象的顺序解除阻塞,那么让所有请求进入同一个线程应该没问题,协程将按照请求的顺序接收它们的对象。因此,您可以将单个线程分配器附加到单个池。缺点是它最终会短暂地挂起以交换线程,即使池没有用完也是如此。
class SuspendingObjectPool<T>(private val sourcePool: ObjectPool<T>) : ObjectPool<T> by sourcePool {
private val dispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
suspend fun borrowObjectSuspending(): T = withContext(dispatcher) { borrowObject() }
}
fun <T> ObjectPool<T>.asSuspendingObjectPool() = SuspendingObjectPool(this)