美文网首页
go并发编程

go并发编程

作者: 萍水间人 | 来源:发表于2020-02-13 11:08 被阅读0次

最近挖了个坑开始学习go语言,打断把其中遇到的坑都记录下来

go学习的过程中最为惊叹的就是并发编程了,我可以少掉好多根头发23333

比如要实现两个切片交互打印,在其他的语言中,比如java感觉写起来还是很痛苦的,但是用go就不一样了。给一个通道,然后两个goroutine之间就通过这个通道进行同步和互斥

代码如下:

package main
import (
   "fmt"
)
func main() {
   a := []int{2,4,6,8}
   b := []int{1,3,5,7}
   c := make(chan int)  //设置一个通道
   go func() {
      for i,value := range a{
         c <- i   //往通道传入一个数
         //time.Sleep(2)
         fmt.Println((value)) //打印数组,然后通道传值
         <- c    
      }
   }()
   for i,value := range b{
      //等待匿名通道
      <-c
      fmt.Println((value))
      c <- i
   }
}

go 就会开启一个goroutine

然后我们的主进程继续运行,到达 <-c 的时候就会自动阻塞

这时候goroutine先执行, c<-i 往通道写一个数据(随便啥都行)
goroutine执行到 <-c 的时候又阻塞了,等待下一个主进程

所以这就很明白了,打印的结果

输出 2 1 4 3 6 5 7 8

但是这种方式还是有点小问题,比如我加一个 time.Sleep(2)
输出的结果就是 12 3 4 5 6 7 8

但是这样不会出问题

package main
import (
   "fmt"
   "time"
)
func main() {
   a := []int{2,4,6,8}
   b := []int{1,3,5,7}
   c := make(chan int)
   go func() {
      for i,value := range a{
         c <- i
         fmt.Println((value))
         <- c
      }
   }()
   for i,value := range b{
      //等待匿名通道
      <-c
      time.Sleep(100) //会不会存在 前一个goroutine自产自销呢?但是是不可能的
      fmt.Println((value))
      c <- i
   }
}

也就是通道不会自产自销,它往里面放数据之后就必须等待其他的goroutine从里面读数据

相关文章

  • Go基础语法(九)

    Go语言并发 Go 是并发式语言,而不是并行式语言。 并发是指立即处理多个任务的能力。 Go 编程语言原生支持并发...

  • Go并发

    Go语言中的并发编程 并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很...

  • 瞅一眼就会使用GO的并发编程分享

    [TOC] GO的并发编程分享 之前我们分享了网络编程,今天我们来看看GO的并发编程分享,我们先来看看他是个啥 啥...

  • day08-go.GPM

    当别人到go为什么支持高并发,或者问为什么go本身对并发编程友好?以及go与Java对比的并发对比 正确回答: 在...

  • Go语言简介

    Go语言简介 Go语言设计的初衷 针对其他语言的痛点进行设计并加入并发编程为大数据,微服务,并发而生的通用编程语言...

  • 13 Go并发编程初探

    一、Go并发编程概述 Go以并发性能强大著称,在在语言级别就原生支持,号称能实现百万级并发,并以此独步江湖,本专题...

  • Go 基础

    基础 [TOC] 特性 Go 并发编程采用CSP模型不需要锁,不需要callback并发编程 vs 并行计算 安装...

  • go 并发编程

    在资源有限的情况下,如何最大化的利用有限的资源就是并发,提高并发 goroutine runtime包 chann...

  • go并发编程

    最近挖了个坑开始学习go语言,打断把其中遇到的坑都记录下来 go学习的过程中最为惊叹的就是并发编程了,我可以少掉好...

  • Go并发编程

    常见并发模型 进程 & 线程(Apache)C10K 异步非阻塞(Nginx,Libevent,NodeJS) 复...

网友评论

      本文标题:go并发编程

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