zoukankan      html  css  js  c++  java
  • channel通道常见使用场景

    1、读写

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func WriteData(intChan chan int)  {
    	for i:=1;i<=50;i++{
    		intChan<-i
    		fmt.Println("写:",i)
    		time.Sleep(time.Millisecond*100)
    	}
    	close(intChan) //写完后关闭管道
    }
    
    func ReadData(intChan chan int,exitChan chan bool)  {
    	for{
    		v,ok:=<-intChan
    		if !ok{
    			fmt.Println("读取完毕")
    			break
    		}
    		fmt.Println("读:",v)
    	}
    
    	//设置全局标志 告诉main 读取完毕了 main主线程可以关闭了
    	exitChan<-true
    	close(exitChan)
    }
    
    
    
    
    func main() {
    
    	intChan :=make(chan int,50)
    	exitChan:=make(chan bool,1)
    
    	go WriteData(intChan)
    	go ReadData(intChan,exitChan)
    
    	//阻塞主线程
    	for ok:=range exitChan{
    		fmt.Println(ok)
    	}
    }
    
    

    2、管道实现定时通知

    func Notice(d time.Duration) chan bool {
    	c := make(chan bool, 1)
    	go func() {
    		time.Sleep(d) //定时
    		c <- true
    	}()
        close(c)
    	return c
    }
    
    func main() {
    	log.Println("one")
    	<-Notice(time.Second) //管道没有写则阻塞
    	log.Println("tow")
    	<-Notice(time.Second)
    	log.Println("three")
    }
    

    3、管道实现互斥锁

    package main
    
    import (
    	"log"
    	"time"
    )
    
    var counter=0
    
    
    func Increase1000(id int,done chan bool,mutex chan bool){
    	for i:=0;i<1000;i++{
    		mutex<-true //加锁
    		counter+=1
    		time.Sleep(time.Microsecond)
    		<-mutex //解锁
    	}
    	done<-true
    }
    
    
    func main() {
    	mutex,done:=make(chan bool,1),make(chan bool)
    	go Increase1000(1,done,mutex)
    	go Increase1000(2,done,mutex)
    
    	<-done;<-done
    	log.Println(counter)
    }
    
    
  • 相关阅读:
    xp_cmdshell
    常用SQL语句
    SQL Server Select的递归查询-交叉表
    Sql Server 2005 行转列的实现(横排)
    sql导入导出
    使用正则表达式验证手机号、车牌号
    页面功能:设为首页和加入收藏
    两个文本框同步输入
    最常用的200个JS代码
    .NET 获取时间
  • 原文地址:https://www.cnblogs.com/biningooginind/p/12545885.html
Copyright © 2011-2022 走看看