Skip to content

Instantly share code, notes, and snippets.

@gofenix
Last active July 10, 2018 12:06
Show Gist options
  • Save gofenix/58370d9854a8695c9263435d3cfe266d to your computer and use it in GitHub Desktop.
Save gofenix/58370d9854a8695c9263435d3cfe266d to your computer and use it in GitHub Desktop.
sync demo
func syncDemo() {
	log.Println("start", time.Now())
	var t1, t2 int
	var err error
	var wg sync.WaitGroup
	wg.Add(2)
	go func(id int, wg *sync.WaitGroup) {
		defer wg.Done()
		time.Sleep(3 * time.Second)
		log.Println("go 1 ", id, time.Now())
		t1 = id + 3
		err = errors.New("go 1 error")
	}(1, &wg)
	go func(id int, wg *sync.WaitGroup) {
		defer wg.Done()
		time.Sleep(1 * time.Second)
		log.Println("go 2 ", id, time.Now())
		t2 = id + 3
		err = errors.New("go 2 error")
	}(2, &wg)
	wg.Wait()
	time.Sleep(time.Second * 5)
	if err != nil {
		log.Println(err)
		return
	}
	log.Println("done", time.Now(), t1, t2)
}
func channelDemo() {
	log.Println("start", time.Now())
	t1 := make(chan int)
	t2 := make(chan int)
	err := make(chan error)
	go func(id int) {
		time.Sleep(3 * time.Second)
		log.Println("go 1 ", id, time.Now())
		err <- errors.New("go 1 error")
		t1 <- id + 3
	}(1)
	go func(id int) {
		time.Sleep(1 * time.Second)
		log.Println("go 2 ", id, time.Now())
		err <- errors.New("go 2 error")
		t2 <- id + 3
	}(2)
	time.Sleep(time.Second * 5)
	for i := 0; i < 4; i++ {
		select {
		case n := <-err:
			log.Println(n)
			return
		case total := <-t1:
			log.Println("total", total)
		case size := <-t2:
			log.Println("size", size)
		}
	}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment