zoukankan      html  css  js  c++  java
  • golang---channel

    0. 参考

    1. 目录结构

    jeffreyguan@jeguan ~/main$ tree                                                                                                                                                                
    .
    ├── channel
    │   └── woker.go
    ├── go.mod
    └── main.go
    
    1 directory, 3 files
    
    

    2. main.go

    package main
    
    import (
    	"fmt"
    	"main/channel"
    )
    
    func main() {
    	fmt.Println("Begin...")
    	// demo1
    	//channel.ChanDemo()
    
    	//	demo2
    	channel.ChanDemo2()
    }
    
    

    3. channel.go

    package channel
    
    import (
    	"fmt"
    	"time"
    )
    
    // begin: demo1
    func ChanDemo() {
    	var channels [10]chan int
    
    	for i := 0; i < 10; i++ {
    		channels[i] = make(chan int)
    
    		go Worker(i, channels[i])
    	}
    
    	for i, c := range channels {
    		c <- 'a' + i
    	}
    
    	time.Sleep(time.Minute)
    }
    
    func Worker(id int, c chan int) {
    	for {
    		fmt.Printf("Worker %d received %d
    ", id, <-c)
    	}
    }
    
    // end: demo1
    
    // begin: demo2
    func ChanDemo2() {
    	var channels [10]chan<- int
    
    	for i := 0; i < 10; i++ {
    		channels[i] = CreateWorker(i)
    	}
    
    	for i, c := range channels {
    		c <- 'a' + i
    	}
    
    	time.Sleep(time.Minute)
    }
    
    func CreateWorker(id int) chan<- int {
    	c := make(chan int)
    
    	go func() {
    		fmt.Printf("Worker %d received %c
    ", id, <-c)
    	}()
    
    	return c
    }
    
    // end: demo2
    
    

    4. 同步

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	fmt.Println("Begin...")
    
    	Done := make(chan bool, 1)
    	go SyncWorker(Done)
    	<-Done
    }
    
    func SyncWorker(done chan<- bool) {
    	time.Sleep(time.Second * 2)
    
    	done <- true
    }
    

    5. 多个channel同步

    package main
    
    import (
    	"fmt"
    	"sync"
    )
    
    func doWork(id int, w worker) {
    	for n := range w.in {
    		fmt.Printf("Worker %d received %c
    ", id, n)
    		
    		w.done()
    	}
    }
    
    type worker struct {
    	in   chan int
    	done func()
    }
    
    func createWorker(id int, wg *sync.WaitGroup) worker {
    	w := worker{
    		in:   make(chan int),
    		done: func() { wg.Done() },
    	}
    
    	go doWork(id, w)
    
    	return w
    }
    
    func chanDemo() {
    	var wg sync.WaitGroup
    
    	var workers [10]worker
    	for i := 0; i < 10; i++ {
    		workers[i] = createWorker(i, &wg)
    	}
    
    	wg.Add(20)
    	for i, worker := range workers {
    		worker.in <- 'a' + i
    	}
    	for i, worker := range workers {
    		worker.in <- 'A' + i
    	}
    
    	wg.Wait()
    }
    
    func main() {
    	chanDemo()
    }
    
  • 相关阅读:
    【动态规划】多重背包
    【动态规划】完全背包问题
    【背包问题】0-1背包、完全背包、多重背包、混合三种背包、二位费用背包、分组背包
    HDU1712ACboy needs your help【分组背包】
    关于kettle
    面向接口编程
    MS Sql添加描述信息 及其他信息
    记录我一个特别酷的梦
    EF 线程内唯一对象
    javascript 学习犯错记录
  • 原文地址:https://www.cnblogs.com/double12gzh/p/12241097.html
Copyright © 2011-2022 走看看