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()
    }
    
  • 相关阅读:
    PDO 数据访问抽象层
    注册审核、批量删除
    分页查询
    会话用法
    封装成类
    多条件查询(复选框条件)
    IP子网划分
    redhat 用yum安装的apache、mysql一般默认安装在哪个目录下?
    nslookup
    linux 设置时间
  • 原文地址:https://www.cnblogs.com/double12gzh/p/12241097.html
Copyright © 2011-2022 走看看