并发编程指南
📅 2026-10-9
xxc 并发编程指南
> 需要 --features concurrency 构建(官方发布的全部二进制均已内置)。
> 解释器与编译产物携带同一套 worker 池运行时,语义一致。
> 相关页:语言指南 ·
> 快速开始 ·
> English: Concurrency Guide。
并发
spawn 启动一个任务,在运行时的 worker 线程上并行执行(worker 数
由 XXC_CONC_WORKERS 指定,默认按 CPU 数推导)。任务极轻(每个是带
独立栈的协程)——可以 spawn 上千个。
ch := chan(4) // 有缓冲通道(容量 4)
spawn {
ch <- compute() // 发送
}
v := <-ch // 接收(阻塞直到可用)
chan()创建无缓冲(汇合)通道;chan(n)创建有缓冲通道。- 满时发送阻塞、空时接收阻塞;阻塞的是任务——其他任务继续运行。
- 无缓冲通道上的值直接递交等接收方。
select
select {
case x := <-ch1 { print("ch1:", x) }
case ch2 <- 42 { print("sent") }
default { print("nothing ready") } // 可选:非阻塞
}
select 提交到首个就绪的操作;带 default 则永不阻塞。通道与发送值
在进入时求值一次。
语义
- main 返回即程序退出(剩余任务丢弃),与 Go 一致;
- 所有任务阻塞且无挂起 I/O 时,运行时报死锁并带源位置;
- 任务间共享
class实例、数组与 channel;struct值跨任务拷贝。
// 并行扇出
results := chan(4)
for i in range(0, 4) {
spawn { results <- fib(31) }
}
sum := 0
for i in range(0, 4) { sum = sum + <-results }
4 核以上机器上可实测快于顺序版本(4 任务实测约 2.3 倍)。
异步 I/O
std/fs、net/tcp、net/http 的调用看起来阻塞,**但绝不拖住其他
任务**:工作被卸到 I/O 线程池,任务挂起直到完成。
import fs "std/fs"
import tcp "net/tcp"
content := fs.read_file("data.txt") // 让位;其他任务继续跑
c := tcp.accept(listener) // 让位
行原子打印
print 语句的各部分(字符串/整数/浮点)在语句级所有者令牌锁下
追加进行缓冲区,遇换行一次性写出——任何后端上,并发任务都不可能
在行中间撕开输出。该性质由 stress 多重集门在 w=2 与 w=4 下逐字验证:
# 验证方式(仓库内):w=4 的输出行多重集必须与 w=1 完全一致
XXC_CONC_WORKERS=4 ./stress_conc | sort # == w=1 的排序结果
运行时行为速记
main返回即程序退出(剩余任务丢弃),与 Go 一致;- 所有任务都阻塞且无挂起 I/O 时,运行时报告死锁并带源位置;
XXC_CONC_WORKERS=N指定 worker 数(默认按 CPU 数推导);- 任务间共享
class实例、数组与 channel;struct值跨任务拷贝。