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()
    }
    
  • 相关阅读:
    Warning: 执行完毕, 但带有警告 trigger trigger_EqPic_insert 已编译。
    c#生成cad缩略图或者图片
    ORACLE ROWNUM解析[转]
    集合已修改;可能无法执行枚举操作。
    JS 变量是否有值的判断
    简单方法解决bootstrap3 modal异步加载只一次的问题
    System.Data.DbType映射关系
    sql zhuan ORACLE
    Enterprise Library
    sql server转oracle需要注意的几点
  • 原文地址:https://www.cnblogs.com/double12gzh/p/12241097.html
Copyright © 2011-2022 走看看