5-1-2 协程实战-优点

24 阅读8分钟

Kotlin协程优点深度解析

一、简化异步编程模型

1.1 消除回调地狱(Callback Hell)

// 传统回调方式 - 回调地狱
fun fetchData(callback: (Result) -> Unit) {
    api.getUser { user ->
        api.getProfile(user.id) { profile ->
            api.getDetails(profile.id) { details ->
                callback(Result(user, profile, details))
            }
        }
    }
}

// 协程方式 - 顺序代码
suspend fun fetchData(): Result {
    val user = api.getUser() // 挂起但不阻塞线程
    val profile = api.getProfile(user.id)
    val details = api.getDetails(profile.id)
    return Result(user, profile, details)
}

// 并发执行 - 使用async
suspend fun fetchConcurrentData(): Result {
    val userDeferred = async { api.getUser() }
    val profileDeferred = async { api.getProfile(1) }
    val detailsDeferred = async { api.getDetails(2) }
    
    return Result(
        userDeferred.await(),
        profileDeferred.await(),
        detailsDeferred.await()
    )
}

1.2 异常处理的简化

// 传统错误处理
fun fetchWithErrorHandling(success: (Data) -> Unit, error: (Throwable) -> Unit) {
    api.getData(
        onSuccess = { data ->
            try {
                process(data)
                success(data)
            } catch (e: Exception) {
                error(e)
            }
        },
        onError = { error(it) }
    )
}

// 协程错误处理 - 使用try-catch
suspend fun fetchWithErrorHandling(): Data {
    return try {
        val data = api.getData()
        process(data)
        data
    } catch (e: Exception) {
        // 统一的错误处理
        logError(e)
        fallbackData()
    }
}

// 使用CoroutineExceptionHandler统一处理
val exceptionHandler = CoroutineExceptionHandler { _, exception ->
    println("协程异常: $exception")
}

val scope = CoroutineScope(SupervisorJob() + exceptionHandler)
scope.launch {
    // 所有未捕获异常都会被exceptionHandler处理
    fetchData()
}

二、轻量级与高性能

2.1 资源消耗对比

// 线程 vs 协程资源消耗演示
fun compareResourceUsage() {
    // 线程 - 每个线程占用约1MB内存
    val threadCount = 100_000
    val threads = mutableListOf<Thread>()
    
    // 协程 - 可以轻松创建数百万个
    val coroutineCount = 1_000_000
    val scope = CoroutineScope(Dispatchers.IO)
    
    // 创建大量线程(会导致内存溢出)
    // try {
    //     repeat(threadCount) { i ->
    //         threads.add(Thread {
    //             Thread.sleep(1000)
    //             println("Thread $i")
    //         }.apply { start() })
    //     }
    // } catch (e: OutOfMemoryError) {
    //     println("线程创建失败: $e")
    // }
    
    // 创建大量协程(可以正常工作)
    repeat(coroutineCount) { i ->
        scope.launch {
            delay(1000) // 挂起但不阻塞线程
            println("Coroutine $i")
        }
    }
}

// 协程挂起机制原理
class SuspensionExample {
    // 挂起函数在字节码层面被编译为状态机
    suspend fun processData(): String {
        val data1 = fetchFirstData()  // 挂起点1
        val data2 = fetchSecondData() // 挂起点2
        return combine(data1, data2)
    }
    
    // 协程挂起时保存的状态
    data class ContinuationState(
        val label: Int,          // 当前执行位置
        val localVariables: Map<String, Any?>  // 局部变量
    )
}

2.2 上下文切换性能

// 协程调度器优化
fun contextSwitchPerformance() {
    // 1. 避免不必要的调度器切换
    suspend fun efficientOperation() {
        // 整个操作在IO调度器上执行
        withContext(Dispatchers.IO) {
            val data1 = ioOperation1() // 不需要切换调度器
            val data2 = ioOperation2() // 不需要切换调度器
            data1 + data2
        }
    }
    
    // 2. 使用正确的调度器
    fun selectProperDispatcher() {
        val scope = CoroutineScope(Dispatchers.Default)
        
        scope.launch {
            // CPU密集型任务
            cpuIntensiveTask()
            
            // 切换到IO调度器执行IO操作
            withContext(Dispatchers.IO) {
                ioOperation()
            }
            
            // 回到默认调度器
            anotherCpuTask()
        }
    }
    
    // 3. 协程挂起 vs 线程阻塞
    suspend fun nonBlockingIO() {
        // 挂起协程,释放线程
        val result = suspendCancellableCoroutine { continuation ->
            asyncIOOperation { result ->
                // IO完成后恢复协程
                continuation.resume(result)
            }
        }
        // 线程可以处理其他协程
    }
}

三、结构化并发(Structured Concurrency)

3.1 作用域与生命周期管理

// ViewModel中的结构化并发
class UserViewModel : ViewModel() {
    // ViewModel的协程作用域,自动取消
    private val viewModelScope = CoroutineScope(
        SupervisorJob() + Dispatchers.Main.immediate
    )
    
    // Activity/Fragment中的结构化并发
    class UserActivity : AppCompatActivity() {
        private val scope = MainScope()
        
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            
            // 自动绑定到生命周期
            scope.launch {
                // 当Activity销毁时自动取消
                loadUserData()
            }
        }
        
        override fun onDestroy() {
            super.onDestroy()
            scope.cancel() // 自动取消所有子协程
        }
    }
    
    // 自定义作用域
    class NetworkScope : CoroutineScope {
        private val job = SupervisorJob()
        override val coroutineContext: CoroutineContext = job + Dispatchers.IO
        
        fun close() {
            job.cancel() // 取消作用域内的所有协程
        }
    }
}

// 结构化并发的层级取消
fun hierarchicalCancellation() {
    val parentJob = Job()
    val scope = CoroutineScope(Dispatchers.Default + parentJob)
    
    scope.launch {
        // 子协程1
        launch {
            try {
                delay(Long.MAX_VALUE) // 长时间运行
            } finally {
                println("子协程1被取消") // 会被执行
            }
        }
        
        // 子协程2
        launch {
            delay(1000)
            throw RuntimeException("子协程2异常")
        }
    }
    
    // 当父协程取消时,所有子协程都会被取消
    parentJob.cancel()
    // 子协程2的异常不会影响其他子协程(因为使用SupervisorJob)
}

3.2 资源自动清理

// withContext自动资源管理
suspend fun safeDatabaseOperation(): User {
    return withContext(Dispatchers.IO) {
        val database = openDatabase() // 打开资源
        try {
            database.queryUser()      // 执行操作
        } finally {
            database.close()          // 确保关闭
        }
    }
}

// 使用协程作用域确保资源释放
suspend fun <T> withResource(resource: AutoCloseable, block: suspend () -> T): T {
    return try {
        block()
    } finally {
        resource.close()
    }
}

// 实际应用示例
class FileProcessor {
    suspend fun processFiles(files: List<File>): List<Result> {
        return coroutineScope {
            files.map { file ->
                async {
                    // 每个文件处理都有自己的资源管理
                    withResource(BufferedReader(FileReader(file))) { reader ->
                        val content = reader.readLines()
                        processContent(content)
                    }
                }
            }.awaitAll()
        }
    }
    
    // SupervisorJob防止一个文件处理失败影响其他
    suspend fun processFilesSafely(files: List<File>): List<Result> {
        return supervisorScope {
            files.map { file ->
                async {
                    try {
                        processSingleFile(file)
                    } catch (e: Exception) {
                        Result.Error(e)
                    }
                }
            }.awaitAll()
        }
    }
}

四、Flow响应式流

4.1 冷流与背压支持

// Flow的冷流特性
fun coldFlowExample() {
    val flow = flow {
        println("Flow开始执行")
        emit(1)
        delay(1000)
        emit(2)
        emit(3)
    }
    
    // 每个收集者都会重新执行flow
    GlobalScope.launch {
        flow.collect { value ->
            println("收集者1: $value")
        }
    }
    
    GlobalScope.launch {
        delay(500)
        flow.collect { value ->
            println("收集者2: $value")
        }
    }
}

// 背压处理策略
fun backpressureStrategies() {
    val fastFlow = flow {
        repeat(1000) { i ->
            emit(i)
        }
    }
    
    // 1. 缓冲
    fastFlow.buffer() // 添加缓冲区
    
    // 2. 合并
    fastFlow.conflate() // 只保留最新值
    
    // 3. 收集最新
    fastFlow.collectLatest { value ->
        // 如果新值到达时旧值还没处理完,取消旧处理
        delay(100) // 模拟处理耗时
        println(value)
    }
    
    // 4. 限流
    fastFlow.throttleFirst(100) // 每100ms最多发出一个值
    fastFlow.throttleLatest(100) // 每100ms发出最新值
    fastFlow.debounce(100) // 防抖,等待100ms无新值后发出
}

// StateFlow和SharedFlow
fun stateAndSharedFlow() {
    // StateFlow - 状态容器
    val stateFlow = MutableStateFlow(0)
    
    // SharedFlow - 事件总线
    val sharedFlow = MutableSharedFlow<Event>(
        replay = 10, // 为新订阅者重放最近10个事件
        extraBufferCapacity = 100 // 额外缓冲区
    )
    
    // 热流特性 - 立即开始发射
    val hotFlow = flow {
        while (true) {
            emit(System.currentTimeMillis())
            delay(1000)
        }
    }.shareIn(
        scope = CoroutineScope(Dispatchers.Default),
        started = SharingStarted.WhileSubscribed(5000), // 有订阅者时开始,5秒后停止
        replay = 1
    )
}

4.2 Flow操作符链

// 声明式数据处理管道
suspend fun dataProcessingPipeline() {
    val result = userFlow()
        .filter { user -> user.isActive }           // 过滤
        .map { user -> user.name }                 // 转换
        .transform { name ->                       // 自定义转换
            emit("Mr. $name")
            emit("Ms. $name")
        }
        .distinctUntilChanged()                    // 去重
        .take(10)                                  // 限制数量
        .catch { e ->                              // 异常处理
            emit("Error occurred: ${e.message}")
        }
        .collect { name ->                         // 收集
            println(name)
        }
    
    // 组合多个Flow
    val combined = combine(
        temperatureFlow(),
        humidityFlow(),
        pressureFlow()
    ) { temp, humidity, pressure ->
        WeatherData(temp, humidity, pressure)
    }
    
    // 展平Flow
    val flatMapped = userFlow()
        .flatMapMerge { user ->                    // 并发执行内部flow
            getUserPostsFlow(user.id)
        }
    
    val flatMapConcat = userFlow()
        .flatMapConcat { user ->                   // 顺序执行内部flow
            getUserPostsFlow(user.id)
        }
    
    val flatMapLatest = userFlow()
        .flatMapLatest { user ->                   // 取消前一个,执行最新
            getUserPostsFlow(user.id)
        }
}

五、协程构建器与调度器

5.1 灵活的协程构建

// 不同协程构建器的选择
fun coroutineBuilders() {
    // 1. launch - 启动新协程,不返回结果
    val job = GlobalScope.launch {
        // 后台任务
    }
    
    // 2. async - 启动新协程,返回Deferred<T>
    val deferred: Deferred<String> = GlobalScope.async {
        delay(1000)
        "Result"
    }
    
    // 3. runBlocking - 阻塞当前线程,用于测试和main函数
    runBlocking {
        val result = deferred.await()
        println(result)
    }
    
    // 4. withContext - 切换上下文,返回结果
    suspend fun switchContext(): String = withContext(Dispatchers.IO) {
        // IO操作
        "IO Result"
    }
    
    // 5. supervisorScope - 创建监督作用域
    suspend fun safeOperation() = supervisorScope {
        launch {
            // 即使这个协程失败,其他协程继续
            throw RuntimeException()
        }
        launch {
            delay(1000)
            println("仍然执行")
        }
    }
    
    // 6. coroutineScope - 结构化并发作用域
    suspend fun structuredOperation() = coroutineScope {
        val deferred1 = async { task1() }
        val deferred2 = async { task2() }
        deferred1.await() + deferred2.await()
    }
}

// 自定义调度器
fun customDispatcher() {
    // 1. 限制并发的调度器
    val limitedDispatcher = Dispatchers.IO.limitedParallelism(4)
    
    // 2. 单线程调度器
    val singleThreadDispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
    
    // 3. 自定义线程池
    val customThreadPool = Executors.newFixedThreadPool(8).asCoroutineDispatcher()
    
    // 4. 无限制调度器(小心使用)
    val unlimitedDispatcher = Dispatchers.IO.limitedParallelism(Int.MAX_VALUE)
}

5.2 协程取消与超时

// 协程取消机制
fun cancellationMechanisms() {
    // 1. 协作式取消
    suspend fun cooperativeTask() = coroutineScope {
        val job = launch {
            var i = 0
            while (isActive) { // 检查是否活跃
                println("Processing $i")
                i++
                delay(100) // 挂起函数会检查取消状态
            }
            println("协程被取消")
        }
        
        delay(500)
        job.cancelAndJoin()
    }
    
    // 2. 不可取消的代码块
    suspend fun importantOperation() = withContext(NonCancellable) {
        // 即使父协程被取消,这段代码也会执行完
        delay(1000) // 即使被取消也会挂起
        println("关键操作完成")
    }
    
    // 3. 超时控制
    suspend fun withTimeout() {
        try {
            withTimeout(1000) {
                longRunningTask()
            }
        } catch (e: TimeoutCancellationException) {
            println("操作超时")
        }
    }
    
    // 4. 带超时的资源获取
    suspend fun acquireWithTimeout() {
        val resource = withTimeoutOrNull(500) {
            acquireResource()
        }
        if (resource != null) {
            useResource(resource)
            releaseResource(resource)
        }
    }
    
    // 5. 取消传播
    fun cancellationPropagation() {
        val parentJob = Job()
        val scope = CoroutineScope(Dispatchers.Default + parentJob)
        
        scope.launch {
            launch {
                // 子协程
                delay(1000)
                println("子协程完成")
            }
        }
        
        // 取消父Job会取消所有子协程
        parentJob.cancel()
    }
}

六、与现有生态集成

6.1 Android集成优势

// Android ViewModel集成
class AndroidViewModelExample : ViewModel() {
    // 自动取消的协程作用域
    private val viewModelScope = viewModelScope
    
    fun loadData() {
        viewModelScope.launch {
            // 自动在UI线程执行
            val data = withContext(Dispatchers.IO) {
                repository.fetchData()
            }
            // 自动切回UI线程更新界面
            updateUI(data)
        }
    }
    
    // Lifecycle扩展
    class LifecycleAwareActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            
            // 生命周期感知的协程
            lifecycleScope.launch {
                repeatOnLifecycle(Lifecycle.State.STARTED) {
                    // 只在STARTED状态收集Flow
                    dataFlow.collect { data ->
                        updateUI(data)
                    }
                }
            }
            
            // 监听生命周期状态
            lifecycleScope.launchWhenStarted {
                // 在STARTED时恢复,在STOPPED时挂起
                loadData()
            }
        }
    }
}

// Room数据库集成
@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    fun getUsersFlow(): Flow<List<User>> // Flow自动观察数据库变化
    
    @Insert
    suspend fun insertUser(user: User): Long // 挂起函数
    
    @Transaction
    suspend fun updateUserWithLog(user: User) {
        updateUser(user)
        insertLog("User updated")
    }
}

// Retrofit集成
interface ApiService {
    @GET("users/{id}")
    suspend fun getUser(@Path("id") id: Long): User // 挂起函数
    
    @GET("users")
    suspend fun getUsers(@Query("page") page: Int): List<User>
    
    @GET("users")
    fun getUsersStream(): Flow<List<User>> // Flow支持
}

6.2 Spring框架集成

// Spring WebFlux + Kotlin协程
@RestController
class UserController(
    private val userService: UserService
) {
    @GetMapping("/users/{id}")
    suspend fun getUser(@PathVariable id: Long): User {
        return userService.findUserById(id)
    }
    
    @GetMapping("/users")
    suspend fun getUsers(@RequestParam page: Int = 0): List<User> {
        return userService.findAllUsers(page)
    }
    
    @GetMapping("/users/stream")
    fun streamUsers(): Flow<User> {
        return userService.streamUsers()
    }
}

@Service
class UserService {
    // 事务支持
    @Transactional
    suspend fun updateUser(user: User): User {
        return userRepository.save(user)
    }
    
    // 响应式Repository
    suspend fun findUserById(id: Long): User? {
        return userRepository.findById(id)
    }
}

// 数据库事务管理
@Service
class TransactionalService {
    @Transactional
    suspend fun complexOperation(): Result {
        val user = createUser()
        val profile = createProfile(user.id)
        sendNotification(user.email)
        return Result(user, profile)
    }
    
    // 编程式事务
    suspend fun manualTransaction(): User {
        return transactionManager.executeAndAwait { status ->
            val user = User(name = "Test")
            userRepository.save(user)
            user
        }
    }
}

七、调试与测试

7.1 协程调试支持

// 协程调试工具
fun debuggingCoroutines() {
    // 1. 协程名称
    val job = GlobalScope.launch(CoroutineName("NetworkRequest")) {
        println("协程名称: ${coroutineContext[CoroutineName]?.name}")
    }
    
    // 2. 调试模式
    val debugScope = CoroutineScope(Dispatchers.Default + CoroutineName("DebugScope"))
    
    // 3. 协程ID
    debugScope.launch {
        println("协程ID: ${Thread.currentThread().name}")
    }
    
    // 4. 使用- Dkotlinx.coroutines.debug JVM参数
    // 启动时添加:-Dkotlinx.coroutines.debug=on
    // 会在线程名中显示协程信息
    
    // 5. 结构化日志
    suspend fun logCoroutineInfo() {
        println("""
            Coroutine Context: $coroutineContext
            Thread: ${Thread.currentThread().name}
            Is Active: ${coroutineContext[Job]?.isActive}
        """.trimIndent())
    }
}

// 协程测试
class CoroutineTestExample {
    @Test
    fun `test coroutine with TestCoroutineDispatcher`() = runBlockingTest {
        // TestCoroutineDispatcher提供时间控制
        val testDispatcher = StandardTestDispatcher()
        
        val scope = CoroutineScope(testDispatcher)
        val result = mutableListOf<Int>()
        
        scope.launch {
            delay(1000)
            result.add(1)
            delay(1000)
            result.add(2)
        }
        
        // 推进时间
        testDispatcher.scheduler.advanceTimeBy(500) // 推进500ms
        assertEquals(emptyList<Int>(), result)
        
        testDispatcher.scheduler.advanceTimeBy(500) // 再推进500ms
        assertEquals(listOf(1), result)
        
        testDispatcher.scheduler.advanceTimeBy(1000) // 再推进1000ms
        assertEquals(listOf(1, 2), result)
        
        // 或直接推进到所有任务完成
        testDispatcher.scheduler.runCurrent()
    }
    
    @Test
    fun `test exception handling`() = runBlockingTest {
        val exceptionHandler = TestCoroutineExceptionHandler()
        val scope = CoroutineScope(SupervisorJob() + exceptionHandler)
        
        scope.launch {
            throw RuntimeException("Test exception")
        }
        
        // 验证异常被处理
        assertNotNull(exceptionHandler.uncaughtExceptions.firstOrNull())
    }
}

八、性能对比数据

8.1 性能基准测试

// 协程性能基准
@State(Scope.Benchmark)
open class CoroutineBenchmark {
    private val dispatcher = Dispatchers.IO.limitedParallelism(64)
    private val scope = CoroutineScope(dispatcher)
    
    @Benchmark
    fun coroutineThroughput() = runBlocking {
        val jobs = List(100_000) { index ->
            scope.launch {
                delay(1) // 模拟IO等待
                index * 2
            }
        }
        jobs.awaitAll()
    }
    
    @Benchmark
    fun threadThroughput() {
        val threads = List(10_000) { index ->
            Thread {
                Thread.sleep(1) // 阻塞线程
                index * 2
            }.apply { start() }
        }
        threads.forEach { it.join() }
    }
    
    @Benchmark
    fun flowProcessing() = runBlocking {
        flow {
            repeat(100_000) { i ->
                emit(i)
            }
        }
        .map { it * 2 }
        .filter { it % 3 == 0 }
        .collect()
    }
}

// 实际性能优势总结:
/*
1. 内存使用:
   - 线程:1MB/线程
   - 协程:几十KB/协程

2. 创建速度:
   - 线程:毫秒级
   - 协程:微秒级

3. 上下文切换:
   - 线程:需要内核参与,代价高
   - 协程:用户态切换,代价低

4. 并发数量:
   - 线程:通常几百到几千
   - 协程:可达数百万
*/

九、实际应用案例

9.1 并发处理模式

// 生产者-消费者模式
fun producerConsumerPattern() {
    val channel = Channel<Int>(Channel.UNLIMITED)
    
    // 生产者
    val producer = GlobalScope.launch {
        repeat(100) { i ->
            channel.send(i)
            delay(10)
        }
        channel.close()
    }
    
    // 消费者池
    val consumers = List(10) { consumerId ->
        GlobalScope.launch {
            for (item in channel) {
                println("消费者$consumerId 处理: $item")
                delay(100) // 模拟处理耗时
            }
        }
    }
}

// 扇出-扇入模式
fun fanOutFanInPattern() = runBlocking {
    val inputChannel = produceNumbers()
    val resultChannel = Channel<String>()
    
    // 扇出:多个消费者处理同一输入
    val processors = List(5) { processorId ->
        launch {
            for (number in inputChannel) {
                val result = processNumber(number, processorId)
                resultChannel.send(result)
            }
        }
    }
    
    // 扇入:收集所有结果
    launch {
        processors.awaitAll()
        resultChannel.close()
    }
    
    // 处理最终结果
    for (result in resultChannel) {
        println("结果: $result")
    }
}

// 工作窃取模式
fun workStealingPattern() {
    val workQueue = Channel<WorkItem>()
    val workerCount = Runtime.getRuntime().availableProcessors()
    
    val workers = List(workerCount) { workerId ->
        GlobalScope.launch(Dispatchers.Default) {
            // 每个工作者都有自己的本地队列
            val localQueue = mutableListOf<WorkItem>()
            
            while (isActive) {
                // 优先处理本地队列
                if (localQueue.isNotEmpty()) {
                    val work = localQueue.removeAt(0)
                    processWork(work)
                } else {
                    // 尝试从全局队列窃取工作
                    select<Unit> {
                        workQueue.onReceive { work ->
                            processWork(work)
                        }
                        // 可以添加从其他工作者窃取的逻辑
                    }
                }
            }
        }
    }
}

十、最佳实践总结

10.1 协程使用指南

// 协程最佳实践
object CoroutineBestPractices {
    // 1. 选择合适的调度器
    suspend fun chooseDispatcher() {
        // CPU密集型 - Dispatchers.Default
        withContext(Dispatchers.Default) {
            computeHeavyTask()
        }
        
        // IO密集型 - Dispatchers.IO
        withContext(Dispatchers.IO) {
            readFromFile()
        }
        
        // UI更新 - Dispatchers.Main (Android)
        withContext(Dispatchers.Main) {
            updateUI()
        }
    }
    
    // 2. 避免GlobalScope
    fun avoidGlobalScope() {
        // 不好
        GlobalScope.launch {
            // 生命周期不可控
        }
        
        // 好 - 使用自定义作用域
        class ViewModelScope {
            private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
            
            fun loadData() {
                scope.launch {
                    // 可控制生命周期
                }
            }
            
            fun clear() {
                scope.cancel()
            }
        }
    }
    
    // 3. 正确处理取消
    suspend fun handleCancellation() {
        ensureActive() // 检查是否被取消
        
        // 在finally块中清理资源
        val resource = acquireResource()
        try {
            useResource(resource)
        } finally {
            withContext(NonCancellable) {
                releaseResource(resource)
            }
        }
    }
    
    // 4. 使用结构化并发
    suspend fun structuredConcurrency(): Result = coroutineScope {
        val deferred1 = async { fetchData1() }
        val deferred2 = async { fetchData2() }
        
        Result(deferred1.await(), deferred2.await())
    }
    
    // 5. 监控协程性能
    fun monitorCoroutines() {
        val scope = CoroutineScope(
            Dispatchers.Default +
            CoroutineName("PerformanceMonitor") +
            CoroutineExceptionHandler { _, e ->
                logError(e)
            }
        )
        
        // 跟踪协程执行时间
        suspend fun <T> measureTime(block: suspend () -> T): T {
            val startTime = System.currentTimeMillis()
            return try {
                block()
            } finally {
                val duration = System.currentTimeMillis() - startTime
                if (duration > 1000) {
                    println("长时间运行协程: ${coroutineContext[CoroutineName]?.name}")
                }
            }
        }
    }
}

// 协程安全规则
val coroutineSafetyRules = listOf(
    "1. 不要从不同调度器访问共享可变状态",
    "2. 使用线程安全的数据结构(如ConcurrentHashMap)",
    "3. 使用Mutex或Semaphore保护共享资源",
    "4. 避免在协程间传递可变对象",
    "5. 使用Channel或Flow进行协程间通信",
    "6. 确保所有挂起函数都是可取消的",
    "7. 正确处理协程异常,避免崩溃",
    "8. 为协程命名以便调试",
    "9. 监控协程内存使用",
    "10. 编写协程单元测试"
)

总结优势

Kotlin协程的主要优点总结:

  1. 简化并发:顺序编写异步代码,避免回调地狱
  2. 轻量高效:内存占用少,上下文切换快
  3. 结构化并发:自动生命周期管理,避免内存泄漏
  4. 异常处理统一:使用try-catch处理异步异常
  5. Flow响应式流:声明式数据处理,背压支持
  6. 生态集成:完美集成Android、Spring等框架
  7. 调试友好:支持协程名称、ID等调试信息
  8. 测试简单:提供TestCoroutineDispatcher等测试工具
  9. 多平台:支持JVM、JS、Native
  10. 官方支持:JetBrains官方维护,持续更新

通过合理使用协程,可以大幅提升应用的并发性能、代码可维护性和开发效率。