文档/进阶/并发编程

并发编程

NovaLang 异步与并发编程指南

并发编程

NovaLang 内置丰富的并发原语,从简单的 async/await 到结构化并发。

async / await

// 异步执行,返回 Future
val future = async {
    heavyComputation()
}

// 等待结果
val result = await future

launch

fire-and-forget 异步,不关心返回值:

val job = launch {
    println("后台任务执行中")
}

parallel

同时执行多个任务,等待全部完成:

val results = parallel(
    { fetchUserData() },
    { fetchOrders() },
    { fetchRecommendations() }
)

scope / sync

适合"异步加载 → 主线程应用"的场景:

scope {
    val data = loadDataFromNetwork()
    sync {
        // 回到主线程使用数据
        updateUI(data)
    }
}

结构化并发

// 所有子任务完成后才返回
coroutineScope {
    val f1 = async { task1() }
    val f2 = async { task2() }
    println(await f1 + await f2)
}

// supervisorScope: 子任务失败不影响其他任务
supervisorScope {
    launch { riskyTask1() }
    launch { riskyTask2() }
}

Dispatchers

// 在 IO 线程池执行
withContext(Dispatchers.IO) {
    val data = readFile("large.csv")
}

// 在默认线程池执行 (CPU 密集)
withContext(Dispatchers.Default) {
    sort(largeList)
}

定时任务

// 延迟执行
val task = schedule(1000) {
    println("1 秒后执行")
}

// 重复执行
val repeating = scheduleRepeat(0, 5000) {
    println("每 5 秒执行一次")
}

// 取消
repeating.cancel()

// 异步延迟
scope {
    delay(1000)
    println("1 秒后")
}

超时控制

withTimeout(5000) {
    longRunningTask()
}
// 超时会抛出 TimeoutException

Channel — 线程间通信

val ch = Channel(10)  // 缓冲大小 10

launch {
    for (i in 1..5) {
        ch.send(i)
    }
    ch.close()
}

while (true) {
    val v = ch.receive()
    if (v == null) break
    println(v)
}

原子变量

val counter = AtomicInt(0)

parallel(
    { repeat(1000) { counter.incrementAndGet() } },
    { repeat(1000) { counter.incrementAndGet() } }
)

println(counter.get())  // 2000

Mutex — 互斥锁

val mutex = Mutex()
var shared = 0

parallel(
    { repeat(1000) { mutex.lock(); shared += 1; mutex.unlock() } },
    { repeat(1000) { mutex.lock(); shared += 1; mutex.unlock() } }
)

awaitAll / awaitFirst

val f1 = async { task1() }
val f2 = async { task2() }
val f3 = async { task3() }

// 等待全部完成
val all = awaitAll(f1, f2, f3)

// 等待最快完成的那个
val fastest = awaitFirst(f1, f2, f3)