Rust中跨线程取消的运行中Future是否会在非await点停止?
Rust Future取消的执行逻辑
结论:Future被取消时不会立即中断同步代码,必须等到下一个await点才会停止执行
Rust的异步取消是协作式的,核心逻辑是:只有在执行await操作时,才会检查当前Future的取消状态。如果此时Future已被取消,await会直接终止后续代码的执行;但如果是在纯同步的代码段(比如没有await的循环、普通计算)中,就算Future被取消,这段代码也会完整执行完毕,因为没有机会触发取消检查。
结合你给出的代码具体分析:
- 第一个
for循环(打印Hello 0!到Hello 499!)是纯同步代码,没有任何await。哪怕Future在这个循环执行过程中被取消,循环也会跑完所有500次迭代,所有打印语句都会执行。 - 当代码执行到
sleep(Duration::from_secs(1)).await这个await点时,才会检查取消状态:如果此时Future已被取消,await会直接终止,后续的第二个for循环根本不会启动。 - 假设Future是在第二个
for循环执行时被取消(比如函数末尾存在未执行的await点),同样因为这个循环里没有await,它会完整执行完500次打印,直到函数结束——取消信号只会在后续的await点才会生效。
简单说,取消信号只会在await处触发,同步代码段会不受影响地执行到底。
内容的提问来源于stack exchange,提问作者kalkronline
相关产品推荐
相关产品推荐

