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()
    }
  • 相关阅读:
    三国演义中的十大谎言 VS 程序员十大口头禅
    Node.js 的单线程事件驱动模型和内置的线程池模型
    为了让医院把医护还给患者,他们用了这个…
    华为云数据库内核专家为您揭秘:GaussDB(for MySQL)并行查询有多快?
    brew
    Python
    Python
    Python
    AtCoder Beginner Contest 215 (个人题解 A~F)
    AcWing 第 13 场周赛  补题记录
  • 原文地址:https://www.cnblogs.com/vincenshen/p/9326056.html
Copyright © 2011-2022 走看看