美文网首页
channel 和阻塞模式和非阻塞模式(1)

channel 和阻塞模式和非阻塞模式(1)

作者: 上弦月Tt | 来源:发表于2020-07-16 00:34 被阅读0次

最近一直又被问到chan 的阻塞和非阻塞模式有什么区别,他们分别在什么场景下使用,写个日记记录下

阻塞模式

示例代码

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)
    ch <- 1
    time.Sleep(3 * time.Second)
    i := <-ch
    fmt.Println(i)
}

很明显以上代码会报错fatal error: all goroutines are asleep - deadlock!,非阻塞channel同一时刻必须有读端(i=:<-ch)和写端(ch <- 1),可以理解为一个同步过程,所以有的地方把他叫做同步通道, 修改代码如下就可以正常运行.

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)
    go func() {
        ch <- 1
        time.Sleep(3 * time.Second)
    }()
    i := <-ch
    fmt.Println(i)
}

应用场景:阻塞主程序,如果能捕获系统Interrupt信号,则退出主程序,执行清理工作, 示例代码如下

func Consumer() {
    // do something
    stop := make(chan os.Signal)

    signal.Notify(stop, os.Interrupt)
    <-stop
    endProcess()
}

func endProcess() {
    fmt.Println("我来结束程序")
    time.Sleep(3 * time.Second)
}

如果使用select 程序永远都不会报fatal error: all goroutines are asleep - deadlock!如下所示

package main

import (
    "fmt"
    "time"
)

func main() {
    messages := make(chan string)
    signals := make(chan bool)

    select {
    case msg := <-messages:
        fmt.Println("received message", msg)
    default:
        fmt.Println("no message received")
    }

    go func() { messages <- "hi" }()
    time.Sleep(1 * time.Second)
    

    select {
    case msg := <-messages:
        fmt.Println("received message", msg)
    case sig := <-signals:
        fmt.Println("received signal", sig)
    default:
        fmt.Println("no activity")
    }
}

明天争取把非阻塞的通道补上。

相关文章

  • channel 和阻塞模式和非阻塞模式(1)

    最近一直又被问到chan 的阻塞和非阻塞模式有什么区别,他们分别在什么场景下使用,写个日记记录下 阻塞模式 示例代...

  • 阻塞模式和非阻塞模式

    使用socket编程实现数据传输的过程中,通常的默认设置假设套接字是阻塞的。每个TCP套接字有一个发送缓冲区,当应...

  • IO通信模型(二)同步非阻塞模式NIO(NonBlocking

    同步非阻塞模式(NonBlocking IO) 在非阻塞模式中,发出Socket的accept()和read()操...

  • 非阻塞connect和accept

    1 非阻塞connect 1.1 阻塞模式与非阻塞 调用connect会发起三次连接。 阻塞模式下,connect...

  • netty(四)nio之网络编程

    一、阻塞与非阻塞 1.1 阻塞 1.1.1 阻塞模式会存在哪些问题? 1)在阻塞模式下,以下的方法都会导致线程暂停...

  • 操作系统 JVM

    非阻塞IO和异步IO(NIO、AIO) 非阻塞 IO 说完了阻塞模式的使用及其缺点以后,我们这里就可以介绍非阻塞 ...

  • 面试(二)

    1.非阻塞IO和阻塞IO的区别 在阻塞模式下,若从网络流读取不到指定大小的数据量,阻塞IO就在那里阻塞着。非阻塞I...

  • IO 中 Reactor和Proactor 设计模式

    1.Reactor模式和Proactor模式 其实阻塞与非阻塞都可以理解为同步范畴下才有的概念,对于异步,就不会再...

  • NIO代码记录

    Buffer 缓冲 Channel通道 阻塞 非阻塞 管道

  • epoll ET LT

    LT模式为什么同时支持阻塞和非阻塞? 如果LT模式是阻塞的,我们不用一次读完所有数据 epoll_wait会一直有...

网友评论

      本文标题:channel 和阻塞模式和非阻塞模式(1)

      本文链接:https://www.haomeiwen.com/subject/ulgshktx.html