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()
    }
  • 相关阅读:
    HDU 1124 Factorial
    hdu 1690 Bus System
    hdu 1113 Word Amalgamation
    POJ 2482 Stars in Your Window
    hdu 1385 ZOJ 1456 Minimum Transport Cost(经典floyd)
    hdu 1907 John
    VMware 虚拟机 安装 UBuntu 9.10 命令模式转换成窗口模试
    #pragma CODE_SEG __NEAR_SEG NON_BANKED详解
    Ubuntu 下Hadoop 伪分布式 hadoop0.20.2.tar.gz 的安装
    文件拷贝代码以及疑问
  • 原文地址:https://www.cnblogs.com/vincenshen/p/9326056.html
Copyright © 2011-2022 走看看