zoukankan      html  css  js  c++  java
  • Go_Context

    https://www.liwenzhou.com/posts/Go/go_context/

    1. 主goroutine如何通知子goroutine退出

    1.1 使用全局变量

    package main
    
    import (
    	"fmt"
    	"sync"
    	"time"
    )
    
    var wg sync.WaitGroup
    // 使用全局变量来通知子goroutine退出
    // 主goroutine来设置notify的值
    var notify bool
    
    func f() {
    	defer wg.Done()
    	for {
    		fmt.Println("==")
    		time.Sleep(time.Millisecond * 500)
    		if notify {
    			break
    		}
    	}
    }
    
    func main() {
    	wg.Add(1)
    	go f()
    	time.Sleep(time.Second * 5)
    	// 如何通知子goroutine退出
    	notify = true
    	wg.Wait()
    
    }

    1.2 使用channel

    package main
    
    import (
    	"fmt"
    	"sync"
    	"time"
    )
    
    var wg sync.WaitGroup
    var exitChan = make(chan bool, 1)
    
    func f() {
    	defer wg.Done()
    FORLOOP:
    	for {
    		fmt.Println("==")
    		time.Sleep(time.Millisecond * 500)
    		select {
    		case <-exitChan:
    			break FORLOOP
    		default:
    		}
    	}
    }
    
    func main() {
    
    	wg.Add(1)
    	go f()
    	time.Sleep(time.Second * 5)
    	// 如何通知子goroutine退出
    	exitChan <- true
    	wg.Wait()
    }
    

    1.3 使用context(为了协同开发,官方弄了这个context)

    package main
    
    import (
    	"context"
    	"fmt"
    	"sync"
    	"time"
    )
    
    var wg sync.WaitGroup
    
    func f2(ctx context.Context) {
    	defer wg.Done()
    FORLOOP:
    	for {
    		fmt.Println("保德路")
    		time.Sleep(time.Millisecond * 500)
    		select {
    		case <-ctx.Done():
    			break FORLOOP
    		default:
    		}
    	}
    }
    
    func f(ctx context.Context) {
    	defer wg.Done()
    	// f2私有f调的,context也是由f给的
    	// 在主goroutine调cancel()的时候都会传到f2,不管有多少级
    	go f2(ctx)
    FORLOOP:
    	for {
    		fmt.Println("==")
    		time.Sleep(time.Millisecond * 500)
    		select {
    		case <-ctx.Done():
    			break FORLOOP
    		default:
    		}
    	}
    }
    
    func main() {
    	ctx, cancel := context.WithCancel(context.Background())
    	wg.Add(1)
    	go f(ctx)
    	time.Sleep(time.Second * 5)
    	// 如何通知子goroutine退出
    	cancel() // 往ctx.Done()写一个空的结构体,拿到结构体就知道要退出了
    	wg.Wait()
    }
    

      

  • 相关阅读:
    JS中的继承(上)
    一篇文章理解JS继承——原型链/构造函数/组合/原型式/寄生式/寄生组合/Class extends
    JS 装饰器,一篇就够
    理解 JavaScript 的 async/await
    JS正则表达式入门,看这篇就够了
    JavaScript的几种循环方式
    全解跨域请求处理办法
    下班后的时间精力生活管理办法(时间管理)
    hexo上部署博客到Github失败
    11
  • 原文地址:https://www.cnblogs.com/yzg-14/p/12298514.html
Copyright © 2011-2022 走看看