You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化Kotlin中的N个异步并发调用?对比Python实现

优化Kotlin异步HTTP请求代码的方案

你的Kotlin代码和Python版本功能等价,但性能差距大主要是因为几个关键问题,下面是针对性的优化方案:

核心问题分析

  1. 重复创建HttpClient:每次async块里都新建HttpClient,这是重量级对象,重复初始化会带来额外开销
  2. 用了同步请求方法:client.send()是同步阻塞调用,会卡住协程线程,完全没发挥协程的异步优势
  3. 协程调度器不合理:默认调度器不适合IO密集型操作,容易造成线程资源浪费

优化后的完整代码

import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
import java.net.URI
import kotlin.system.measureTimeMillis
import kotlinx.coroutines.*
import kotlinx.coroutines.future.await

// 全局复用一个HttpClient实例,线程安全无需重复创建
private val httpClient = HttpClient.newBuilder().build()

fun main() = runBlocking {
    val timeElapsed = measureTimeMillis {
        val deferreds = (1..7).map { id ->
            // 指定IO调度器处理HTTP请求这类IO密集操作
            async(Dispatchers.IO) {
                val request = HttpRequest.newBuilder()
                    .uri(URI.create("URL_WITH_INCREASING_PATH_PARAMETER/$id"))
                    .build()

                // 用sendAsync异步请求+await挂起等待,避免阻塞线程
                val response = httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString()).await()
                response.body()
            }
        }

        val data = deferreds.awaitAll()
        println("$data")
    }

    println("time elapsed $timeElapsed")
}

额外优化建议

  • 对齐Python的JSON解析:原Python代码直接解析JSON返回对象,你可以给Kotlin添加JSON库(比如Jackson),把响应字符串转成对应的数据类,让功能完全等价:
    // 示例:用Jackson解析JSON
    import com.fasterxml.jackson.module.kotlin.readValue
    private val objectMapper = com.fasterxml.jackson.module.kotlin.jacksonObjectMapper()
    
    // 在async块里替换response.body():
    objectMapper.readValue<YourDataClass>(response.body())
    
  • 添加超时配置:避免请求无限等待,给HttpClient和请求设置超时:
    private val httpClient = HttpClient.newBuilder()
        .connectTimeout(java.time.Duration.ofSeconds(10))
        .build()
    
    // 请求单独设置超时
    val request = HttpRequest.newBuilder()
        .uri(URI.create("URL_WITH_INCREASING_PATH_PARAMETER/$id"))
        .timeout(java.time.Duration.ofSeconds(10))
        .build()
    

优化效果说明

优化后,HttpClient复用减少了初始化开销,异步请求配合IO调度器实现真正的非阻塞并发,总耗时会大幅降低,接近Python版本的表现。

内容的提问来源于stack exchange,提问作者Petesta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:47:40