美文网首页程序员
Golang的并发编程

Golang的并发编程

作者: Yancey_BFD | 来源:发表于2016-12-21 00:29 被阅读1025次

Golang中的并发编程

Golang语言中,并发使用的协程的机制,实现起来也是十分的方便,使用go关键字即可。

func main() {
    ...
    go fun(){
        fmt.Println("Hi, Here is a goroutine.")
    }()
    ...
}

channel

Channel是Golang语言内置的一种管道类型,可以读取和发送数据。
goroutine之间的同步控制主要是通过channel来控制的

channel的基本语法

  1. 定义一个channel
c := make(chan int) 
cWithBuffer := make(chan int, 10) //带缓冲的channel
  1. 向channel发送消息
c <- 1
  1. 从channel读取消息
    <- c
    v, ok := <- c

如何控制goutine的并行数量

当我们需要去控制goroutine的并行数量时,需要使用到带Buffer的Channel了:

channelWithBuffer := make(chan int, 1)

这表示Channel中最大可以有1个元素

c := make(chan int, 1)
c <- 1 // does not block.
c <- 1 // block... until another goroutine recieves from the channel.

close()的作用

当我们要关闭一个channel时候,可以使用close()函数

close(c)

close函数必须由Sender一方进行调用,当关闭一个channel后,Receiver可以继续将未读完的element从channel中读出来,当最后一个element被读出后,再进行读取操作会导致panic

var c = make(chan int, 10)

func main() {
    c <- 1
    close(c)
    v, ok := <-c
    fmt.Println(v, ok)
    v, ok = <-c
    fmt.Println(v, ok)
}
1 true
0 false

什么是单向chan

类似C++中的Const关键词,有时需要显示的声明某个函数不允许向channel中写入或者读取数据,这时会用到了单向channel

func recive(c1 <-chan int, c2 chan<- int) {
    v := <-c1
    c2 <- v
}
func send(c chan<- int) {
    c <- 1
}
func main() {
    c1 := make(chan int, 1)
    c2 := make(chan int, 1)
    send(c1)
    recive(c1, c2)
    fmt.Println(<-c2)
}

timeout机制

使用select可以实现goutinue的超时控制

func main() {
    c := make(chan int, 1)
    go func() {
        time.Sleep(time.Second * 2)
        c <- 1
    }()
    select {
    case v := <-c:
        fmt.Println(v)
    case <-time.After(time.Second):
        fmt.Println("time out")
    }
}

相关文章

  • Golang的并发编程

    golang是为并发而生的语言。优雅的并发编程范式,完善的并发支持,出色的并发性能是golang区别于其他语言的一...

  • Golang的并发编程

    Golang中的并发编程 Golang语言中,并发使用的协程的机制,实现起来也是十分的方便,使用go关键字即可。 ...

  • Golang并发编程

    Go 语言简介(下)— 特性 并发不是并行Go负载均衡 一个Go例程(Goroutines)就是一个和其它Go例程...

  • Golang并发编程

    在Go语言中,语言本身就已经实现和支持了并发, 我们只需要通过go关键字来开启goroutine即可。 gouro...

  • golang并发编程

    https://go101.org/article/channel-use-cases.html https://...

  • 【转载】Golang处理大数据时使用高效的Pipeline(流水

    并发是件技术活 Golang被证明非常适合并发编程,goroutine比异步编程更易读、优雅、高效。本文提出一个适...

  • Go goroutine

    Golang特色之一是支持高并发编程模型,以Goroutine作为基本的并发执行单元。 Goroutine是轻量级...

  • Golang之并发编程一

    并发基础 在说Golang的并发编程之前,先认识一下目前并发的几种实现方式: 1.多进程。操作系统实现的并发模型,...

  • GoLang并发编程3

    并发编程有两个模式 共享内存 消息 共享内存,以C语言举例 换成 GoLang

  • golang并发编程tips

    作为服务端的开发,最关注的就是并发编程,每个从java接触到golang的小伙伴应该都会有一些共同的困惑,做个总结...

网友评论

    本文标题:Golang的并发编程

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