github.com/maikovskiys/l1tasks@v0.0.0-20230927052451-6436d7687dc9/develop/dev06/main.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"sync"
     7  	"time"
     8  )
     9  
    10  /*
    11  Реализовать все возможные способы остановки выполнения горутины.
    12  */
    13  func main() {
    14  	wg := sync.WaitGroup{}
    15  	ctx, cancel := context.WithCancel(context.Background())
    16  	ch := make(chan struct{})
    17  	wg.Add(1)
    18  	go func(chan struct{}, context.Context) {
    19  		defer wg.Done()
    20  		counter := 0
    21  		for {
    22  			counter++
    23  			var d struct{}
    24  			fmt.Println("g1 stopped after writing in chan")
    25  			time.Sleep(time.Second)
    26  			ch <- d
    27  			fmt.Println("g1 do next work")
    28  			if counter == 4 {
    29  				close(ch)
    30  				cancel()
    31  				break
    32  			}
    33  		}
    34  		fmt.Println("g1 work end")
    35  	}(ch, ctx)
    36  
    37  	wg.Add(1)
    38  	go func(context.Context) {
    39  		defer wg.Done()
    40  		fmt.Println("g2 stopped by select")
    41  		select {
    42  		case <-ctx.Done():
    43  			fmt.Println("g2 select end")
    44  			break
    45  		}
    46  		fmt.Println("g2 do next work")
    47  		fmt.Println("g2 end ")
    48  
    49  	}(ctx)
    50  	wg.Add(1)
    51  	go func() {
    52  		defer wg.Done()
    53  		fmt.Println("g3 stopped for reading from ch")
    54  		for v := range ch {
    55  			_ = v
    56  			time.Sleep(3 * time.Second)
    57  		}
    58  		fmt.Println("g3 do next work")
    59  		fmt.Println("g3 work end")
    60  	}()
    61  	fmt.Println("main stopped by wg")
    62  	wg.Wait()
    63  	fmt.Println(" main do next work")
    64  	fmt.Println("main end ")
    65  
    66  }