Pysolate Spine中文旁白 + HTML 图解全部小课 ↗

知识小点 · 解开一个疑问

Go context:取消是通知,收尾靠等待

用一个无 sleep 的 Go 例子和项目真实代码,看 context 取消如何通知工具,以及 WaitGroup 怎样确认 worker 已经退出。

01 / 05

每轮先拿到一对 context

cancel 是通知入口,不是强杀按钮

准备播放
CONTEXT CANCELLATION / 协作取消一轮运行的取消入口
当前步骤
SIGNAL可取消ctx.Done() 可被观察
WORKER尚未收尾等待合作退出
JOIN需要等待WaitGroup 确认收尾
通知已建立future.go · 31–33
SOURCE真实代码与最小示例
关键行

        
        func newRun(ctx context.Context, r *Runner, enabled bool) *runState {
      
        
            ctx, cancel := context.WithCancel(ctx)
      
        
            return &runState{runner: r, ctx: ctx, cancel: cancel, enabled: enabled, futures: make(map[uint32]*future)}
      
        
        }
      
        
        
      
        
        
      
        
        
      
        
        
      
        
        
      
        
        
      
        
        
      
        
        
      
        
        
      
        
        
      
        
        
      
        
        
      
        
        
      
        
        
      
        
        
      
        
        
      
        
        
      

context 是信号通道;它不强杀 goroutine。

下游不检查 ctx,就不会凭空退出。

旁白

点一下播放即可。也可以只听声音,或拖动进度跳到想看的位置。

0:001:29

正在准备本课音轨与图解。首次播放需要点一下。

跳到某一节 / 查看讲稿