zoukankan      html  css  js  c++  java
  • Go channel

    Channel常用与goroutine之间传递消息和数据

    Channel基础用法:

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func worker(id int, ch chan int) {
        for n := range ch{
            fmt.Printf("Worker %d received %d
    ", id, n)
        }
    }
    
    func createWorker(id int) chan<- int {
        ch := make(chan int)
        go worker(id, ch)
        return ch
    }
    
    func chanDemo() {
        var channels [10]chan<- int
        for i := 0; i < 10; i++ {
            channels[i] = createWorker(i)
        }
    
        for i := 0; i < 10; i++ {
            channels[i] <- 'a' + i
        }
    
        for i := 0; i < 10; i++ {
            channels[i] <- 'A' + i
        }
        time.Sleep(time.Millisecond)
    }
    
    func bufferedChannel() {
        ch := make(chan int, 3)
        go worker(0, ch)
        ch <- 'a'
        ch <- 'b'
        ch <- 'c'
        ch <- 'd'
        time.Sleep(time.Millisecond)
    }
    
    func channelClose()  {
        ch := make(chan int)
        go worker(0, ch)
        ch <- 'a'
        ch <- 'b'
        ch <- 'c'
        ch <- 'd'
        close(ch)
        time.Sleep(time.Millisecond)
    }
    
    func main() {
    
        fmt.Println("Channel as firts-class citizen")
        chanDemo()
        
        fmt.Println("Buffered channel")
        bufferedChannel()
        
        fmt.Println("Channel close and range")
        channelClose()
    }

    Channel 任务等待

    package main
    
    import (
        "fmt"
        "sync"
    )
    
    func doWorker(id int, ch chan int, wg *sync.WaitGroup) {
        for n := range ch {
            fmt.Printf("Worker %d received %c
    ", id, n)
            wg.Done()
        }
    }
    
    type worker struct {
        in   chan int
        wg *sync.WaitGroup
    }
    
    func createWorker(id int, wg *sync.WaitGroup) worker {
        w := worker{
            in: make(chan int),
            wg: wg,
        }
        go doWorker(id, w.in, wg)
        return w
    }
    
    func chanDemo() {
        var wg sync.WaitGroup
    
        var workers [10]worker
        for i := 0; i < 10; i++ {
            workers[i] = createWorker(i, &wg)
        }
    
        for i, worker := range workers {
            worker.in <- 'a' + i
            wg.Add(1)    // 添加一个任务
        }
    
        for i, worker := range workers {
            worker.in <- 'A' + i
            wg.Add(1)    // 添加一个任务
        }
        wg.Wait()
    }
    
    func main() {
        // sync.WaitGroup  等待多任务结束
        chanDemo()
    }
  • 相关阅读:
    CentOS7使用firewalld打开关闭防火墙与端口
    ssh连接卡在【To escape to local shell, press 'Ctrl+Alt+]'.】的解决方法
    本地链路地址
    RIFF和WAVE音频文件格式
    声音分贝的概念,dBSPL.dBm,dBu,dBV,dBFS
    VS中C++ 项目重命名
    FFmpeg学习6:视音频同步
    FFmpeg学习5:多线程播放视音频
    FFmpeg学习4:音频格式转换
    FFmpeg数据结构:AVPacket解析
  • 原文地址:https://www.cnblogs.com/vincenshen/p/9326056.html
Copyright © 2011-2022 走看看