取消与超时(Cancellation)
取消不产生错误,走协商语义:函数声明自己可取消,被取消时由体内普通 return 返回一个值,任务正常完成。
cancellable 函数
import Async.*;
cancellable async func Work() -> int
{
await 5s;
if cancel.requested
{
return -1;
}
return 42;
}cancellable 修饰后,函数体内有了 cancel.requested与 cancel.token。
cancel 与 timeout
async func main() -> int
{
val cts = new CancellationTokenSource();
val t = Work() cancel cts.Token;
cts.Cancel();
print(await t);
print(await Work() timeout 100ms);
return 0;
}-1
-1task 值挂 timeout
spawn 结果存变量后仍可设死线,语法就是 timeout 后缀:
val t = spawn
{
await 5s;
return 99;
};
val t2 = t timeout 500ms;
print(await t2);0到 timeout 死线,底层任务被终态化为取消:并没有产出并行的新任务,是被修饰的那个 task 本身终态化了,await t2 会拿类型缺省值继续走。
组合器
async func Quick() -> int
{
await 20ms;
return 9;
}
val both = await all([Quick(), Quick()]);
print(both);
val first = await any([Quick(), Quick()]);
print(first);[9, 9]
9all:全部完成才完成,返回list<T>。首个失败短路 fault,进程随之带错退出,其余任务不再继续执行。any:首个终态决定结果,返回T。其余任务不被取消,继续跑完:any返回后如果还在推进时钟,未胜出的任务会照常执行完,要停得自己取消。allSettled:等全部终态,返回列表按输入序排列(不按完成序),不短路。
操作数收 list<task<T>> 或 task<T>[]。也可以直接这样写:await all([A() cancel ct, B() cancel ct]),取消后各自返回协商值。
令牌族
令牌类型在 std::Async 模块:CancellationTokenSource 有 Cancel()、CancelAfter(d)、Token 属性,CancellationToken 结构体有 IsCancellationRequested、CanBeCanceled、静态 None()。
注意
- spawn 也有取消形:
spawn cancel ct { }的块体是匿名 cancellable 环境,体内可用cancel.*。 - 嵌套 lambda / 普通嵌套函数体里看不到
cancel.*,体内也不可遮蔽cancel名。
最后更新于 2026年10月10日
