热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang并发编程的实现

这篇文章主要介绍了golang并发编程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

go

main函数的执行本身就是一个协程,当使用go关键字的时候,就会创建一个新的协程

channel

channel 管道,用于在多个协程之间传递信号

无缓存管道

当对无缓冲通道写的时候,会一直阻塞等到某个协程对这个缓冲通道读

阻塞场景:

  1. 通道中无数据,但执行读通道。
  2. 通道中无数据,向通道写数据,但无协程读取。

综上,无缓存通道的读写必须同时存在,且读写分别在两个不同的协程

func main(){
  ch := make(chan int)
  
  go func(ch chan int){
    ch <-222
  }(ch)
  
  println(<-ch)
}

有缓冲管道

有缓存时可以向通道中写入数据后直接返回,缓存中有数据时可以从通道中读到数据直接返回,这时有缓存通道是不会阻塞的

阻塞场景:

  1. 通道的缓存无数据,但执行读通道。
  2. 通道的缓存已经占满,向通道写数据,但无协程读。

综上,有缓冲通道的读写必须在两个不同协程

func main() {
  ch := make(chan int, 1) //长度为1的缓冲管道也是有缓冲管道
  ch <- 333
  go func(ch chan int) {
    println(<-ch)
  }(ch)
  ch <- 333
}

sync.Mutex 和 sync.RwMutex

sync.Mutex 并发锁,一次只可以加载一个并发锁

sync.RwMutex 读写锁,一次可以加载多个读锁和一个写锁。当写锁存在时候,不能再加载读锁和写锁

sync.WaitGroup

阻塞等待所有任务完成之后再继续执行

WaitGroup在不方法中传递,需要传指针

func main() {
  var wg sync.WaitGroup
  ch := make(chan int, 1000)
  for i := 0; i <1000; i++ {
    wg.Add(1)
    go doSomething(i, &wg, ch)
  }
  wg.Wait()
  fmt.Println("all done")
  for i := 0; i <1000; i++ {
    dd := <-ch
    fmt.Println("from ch:"+strconv.Itoa(dd))
  }
}

func doSomething(index int, wg *sync.WaitGroup, ch chan int) {
  defer wg.Done()
  fmt.Println("start done:" + strconv.Itoa(index))
  //time.Sleep(20 * time.Millisecond)
  ch <- index
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • funcReadXlsx(c[]CmdbTest,SheetNamestring)error{打开文件,如果文件不存在创建,存在就打开path:.cm ... [详细]
  • 按照之前我对map的理解,map中的数据应该是有序二叉树的存储顺序,正常的遍历也应该是有序的遍历和输出,但实际试了一下,却发现并非如此,网上查了下,发现从Go1开始,遍历的起始节点就是随机了,当然随机 ... [详细]
  • golang字符串转Time类型问题小记
      最近在做项目中,遇到了golang字符串转Time类型的问题。调研后发现golang提供了俩种方式,即time.Parse跟time.ParseInLocation。俩种方式差 ... [详细]
  • 七、Golang之切片(slice)-由于数组的长度是固定的,所以有很多的局限性,所以今天讲切片,切片是一个拥有相同类型且长度可变的有序集合,切片和数组两种不同的数据类型,它是基于 ... [详细]
  • kafka lookup VM016centos: no such host
    在windows下打开编辑host增加“ip主机名”获取主机名的命令:h ... [详细]
  • golang 解析磁力链为 torrent 相关的信息
    其实通过http请求已经获得了种子的信息了,但是传播存储种子好像是违法的,所以就存储些描述信息吧。之前python跑的太慢了。这个go并发不知道写的有没有问题?!packag ... [详细]
  • 目录在Go语言项目中使用Zap日志库介绍默认的GoLogger日志库实现GoLogger设置Logger使用LoggerLogger的运行GoLogger的优势和劣势优势劣势Ube ... [详细]
  • Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。类型T表示任意的一种类型双向:chan ... [详细]
  • 目标由于众所周知的原因,golang.org无法直接访问,golang文档和安装包无法下载,golang.orgxnet等官方包无法下载。常见解决方案是无脑挂代理,解决一切问题,但 ... [详细]
  • 20220811:以下go语言代码输出什么?A:panic;B:编译错误;C:json marshal 报错
    2022-08-11:以下go语言代码输出什么?A:panic;B:编译错误;C:jsonmarshal报错;D:null;E:nil。packagemainimport(enc ... [详细]
  • hash表是什么从大学的课本里面,我们学到:hash表其实就是将key通过hash算法映射到数组的某个位置,然后把对应的val存放起来。如果出现了hash冲突(也就是说,不同的ke ... [详细]
  • 下面由golang教程栏目给大家整理在vscode中go编码发生的问题,希望对需要的朋友有所帮助!引言使用VsCode进行Go程序开发,我们肯定会碰到一些问题,这些问题有些是IDE ... [详细]
  • Beanstalk 安装教程
    docker-compose文档ports一定要配置,否则外网无法访问beanstalkd:image:schicklingbeanstalkdcontainer_name:bea ... [详细]
  • Golang 递归打印杨辉三角
    packagemainimportfmtfuncmain(){YangHuiTriangle(10)}funcYangHuiTriangle(nint)[]int{i:n-1l ... [详细]
author-avatar
手机用户2502898443
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有