• golang中管道热替换


    golang中管道替换问题

    https://blog.csdn.net/cyk2396/article/details/78875347

    1.运行以下代码:

    var chan1 chan int
    var chanLength int = 18
    var interval time.Duration = 1500 * time.Millisecond

    //var interval2 time.Duration = 1800 * time.Millisecond

    //golang在替换通道时引起的问题
    func main() {
    chan1 = make(chan int, chanLength)
    //该goroutine是每隔1.5秒向chan1中发送一个元素
    //当满足条件时,重置chan1,此时chan1会指向一个新通道
    go func() {
    for i := 0; i < chanLength; i++ {
    if i > 0 && i%3 == 0 {
    fmt.Println("chan1 reset")
    chan1 = make(chan int, chanLength)
    }
    fmt.Println("send an value : ", i)
    chan1 <- i
    time.Sleep(interval)
    }
    fmt.Println("close chan1")
    close(chan1)
    }()

    //用于接收chan1中的元素
    receive(chan1)
    

    }

    func receive(chan2 chan int) {
    fmt.Println("start receive value from chan1 ...")
    timer := time.After(30 * time.Second)
    Loop:
    for {
    select {
    case e, ok := <-chan2:
    if !ok {
    fmt.Println("chan1 has closed ...")
    break Loop
    }

    		fmt.Println("receive value : ", e)
    		time.Sleep(interval)
    	case &lt;-timer:
    		fmt.Println("time out")
    		break Loop
    	}
    }
    

    }
    结果如下:

    start receive value from chan1 ...
    send an value : 0
    receive value : 0
    send an value : 1
    receive value : 1
    send an value : 2
    receive value : 2
    chan1 reset
    send an value : 3
    send an value : 4
    send an value : 5
    chan1 reset
    send an value : 6
    send an value : 7
    send an value : 8
    chan1 reset
    send an value : 9
    send an value : 10
    send an value : 11
    chan1 reset
    send an value : 12
    send an value : 13
    send an value : 14
    chan1 reset
    send an value : 15
    send an value : 16
    send an value : 17
    close chan1
    time out
    引起这个的原因是:对变量的重新赋值操作是无法被传递的。在上面这个demo中,当chan1指向了新管道时,receive()函数还是调用原来的旧管道。

    解决办法是:通过函数调用每次都获取最新的管道。代码如下:

    var chan1 chan int
    var chanLength int = 18
    var interval time.Duration = 1500 * time.Millisecond

    var interval2 time.Duration = 1550 * time.Millisecond

    //golang在替换通道时引起的问题
    func main() {
    chan1 = make(chan int, chanLength)
    //该goroutine是每隔1.5秒向chan1中发送一个元素
    //当满足条件时,重置chan1,此时chan1会指向一个新通道
    go func() {
    for i := 0; i < chanLength; i++ {
    if i > 0 && i%3 == 0 {
    fmt.Println("chan1 reset")
    chan1 = make(chan int, chanLength)
    }
    fmt.Println("send an value : ", i)
    chan1 <- i
    time.Sleep(interval)
    }
    fmt.Println("close chan1")
    close(chan1)
    }()

    //用于接收chan1中的元素
    receive()
    

    }

    func receive() {
    fmt.Println("start receive value from chan1 ...")
    timer := time.After(30 * time.Second)
    Loop:
    for {
    select {
    case e, ok := <-getChan(): //通过getChan()每次都获取最新的管道
    if !ok {
    fmt.Println("chan1 has closed ...")
    break Loop
    }

    		fmt.Println("receive value : ", e)
    		time.Sleep(interval2) // 时间间隔相比发送方的时间间隔增加50ms,为了在getChan()时能获取最新的chan
    	case &lt;-timer:
    		fmt.Println("time out")
    		break Loop
    	}
    }
    

    }

    //获取管道chan1
    func getChan() chan int {
    return chan1
    }

  • 相关阅读:
    【代码笔记】Java连连看项目的实现(1)——JTable 、TableModel的使用
    【代码笔记】多线程游戏开发——伏魔记:第一步——开始游戏界面实现(一)
    【代码笔记】Java基础:Java的方法和类
    【代码笔记】Java基础:类的继承(构造器)
    【代码笔记】XML深入学习:DTD约束与DTD语法(2)
    常见标签的全称
    CSS中margin与padding的区别
    jquery 执行语句无响应
    jquery autocomplete插件结合ajax使用
    在使用flask_Bootstrap的时候先加载了jquery-ui然后再加载jQuery,导致jQuery-ui无法使用。
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/9263102.html
Copyright © 2020-2023  润新知