gpt4 book ai didi

kotlin - 如何通过改造阻塞客户端和协程实现有限调用

转载 作者:IT老高 更新时间:2023-10-28 13:46:00 26 4
gpt4 key购买 nike

我有以下代码:

val context = newFixedThreadPoolContext(nThreads = 10, name="myThreadPool")
val total = 1_000_000 //can be other number as well
val maxLimit = 1_000
return runBlocking {
(0..total step maxLimit).map {
async(context) {
val offset = it
val limit = it + maxLimit
blockingHttpCall(offset, limit)
}
}.flatMap {
it.await()
}.associateBy {
...
}.toMutableMap()
}

我希望阻塞 api 同时发生 10 个调用。但是,上面的代码似乎没有像我预期的那样做(我认为所有的调用都会立即开始),或者至少我不明白它是否这样做。
实现它的正确方法是什么?如果我使用改造的异步 api,同样的解决方案会起作用吗?

最佳答案

我不完全了解您的情况,但最简单的方法 - 使用 OkHttp API 配置并发级别,例如,这是 default concurrency strategy of OkHttp

但是如果你将自己的 Dispatcher 实例设置为 OkHttpClient.Builder

,你可以有自己的策略

当然,你也可以使用协程

您当前的实现不正确,因为您为每个项目创建协程调度程序,但是要共享线程池,所有协程应该使用相同的调度程序,只需将 newFixedThreadPoolContext 创建移到循环之外(现在您有 1000 个调度程序,每个调度程序有 10 个线程)。

但我不建议你使用协程+阻塞调用,最好配置OkHttp并发(更灵活)和使用非阻塞调用的协程(你可以编写自己的适配器或使用现有的库如kotlin-coroutines-retrofit )。它将允许您混合您的 http 请求和 UI 代码或其他任务。

所以如果你使用非阻塞 API + OkHttp 内部并发,你不需要有特殊的代码来控制并发,当然你可以像上面你的例子那样限制并发调用的数量(固定调度器构造),但我真的认为这没有多大意义,因为您可以降低并发级别,而不是提高并发级别。

迁移到非阻塞 API 后,您可以在任何协程调度程序中并行运行所有协程(甚至在 UI 线程中)并等待结果而不会阻塞。

此外,使用 OkHttpClient 配置隐式控制并发在架构方面看起来是一种更正确的方式(您可以拥有配置 Retrofit + OkHttp 的 DI 代码,并使用预配置的并发策略将其提供给您的客户端代码)。当然,您可以使用其他方法来实现这一点,但这种方法对我来说看起来更自然。

关于kotlin - 如何通过改造阻塞客户端和协程实现有限调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46393209/

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