首页 > 其他分享 >golang 并发之goroutine

golang 并发之goroutine

时间:2023-10-15 16:11:46浏览次数:37  
标签:goroutine chan golang 并发 线程 缓冲区 channel 通道

goroutine 的启动

  1. 将要并发执行的任务包装成一个函数,调用函数时候前面加上go 关键字,就能够开启goroutine去执行该函数的任务
  2.  goroutine对应的函数执行完成,该goroutine就结束
  3.  程序启动的时候自动的创建一个goroutine去执行main函数
  4. main函数结束之后那么程序就该结束了,由该程序的所有其他goroutine也都结束了。
func test(){
   fmt.Printfn("start test")  
}

func main(){
   go test()   
}

  

goroutine的本质

  1. goroutine的调度模型:
  2. GMP
  3. M:N   把m个goroutine分配给n个操作系统线程

goroutine与操作系统线程(os线程)的区别

  1. goroutine是用户态的线程 ,比内核态的线程更加轻量一点,初始时候只占用2kb的栈空间

 runtime.GOMAXPROCS

  1. runtime.GOMAXPROCS(1)  只占用1核cpu

sync.WaitGroup

var wg sync.WaitGroup
wg.Add(1)
wg.Done()
wg.Wait() 

 

  

channel 通道

  1. 通过channel实现多个goroutine 之间的通信
  2. channel:是一种类型 一种引用的类型 make 函数初始化之后才能使用(slice,map,channel)
  3. channel的声明: var ch chan
  4. channel初始化: b = make(chan 元素 [缓冲区大小]) 
  5. channel 的操作
    1. 发送:   ch1 <- 100 
    2.  接收:x := <- ch1
    3.   关闭:close(ch1)
  6. 待缓冲区的通道和不带缓冲区的通道
    1. a = make(chan int )         不带缓冲区的通道   
    2. b = make(chan int ,10 )   待缓冲区的通道 
  7. 单项通道,通常作为函数的参数
    1. 只读通道: <- chan int
    2. 只写通道:chan<- int

 

标签:goroutine,chan,golang,并发,线程,缓冲区,channel,通道
From: https://www.cnblogs.com/zhenhui/p/17765657.html

相关文章

  • 程序并发执行和前驱图
         ......
  • 并发编程-5.使用 C# 进行异步编程
    有关.NET中的异步编程的更多信息通常引入异步代码的场景有两种:•I/O密集型操作:这些操作涉及从网络或磁盘获取的资源。•CPU密集型操作:这些是内存中的CPU密集型操作。在本节中,我们将创建一些针对每种类型的操作使用async和wait的实际示例。无论您是等待外部进程完......
  • 并发编程-4.用户界面响应能力和线程
    利用后台线程在第一章中,我们学习了如何创建后台线程并讨论了它们的一些用途。后台线程的优先级低于进程的主线程和其他线程池线程。此外,活动的后台线程不会阻止用户或系统终止应用程序。这意味着后台线程非常适合执行以下任务:•写入日志和分析数据•监控网络或文件系统资源......
  • 根据实际工作经验总结一下个人.Net高并发处理做法
    场景描述1.用户下单,商品库存已经不足了,但还是扣减了2.医生开方,药品不足了,但还是被开了出去···类似场景解决思路思路1:预扣库存用户下单时,系统先进行预扣库存操作,然后后将“下单业务”发布到MQ(消息队列)进行处理,成功通知,失败回滚预扣库存操作对于预扣库存时可能出现的“......
  • Java并发之AQS
    一、AQS是什么AbstractQueuedSynchronizer抽象同步队列,简称AQS,它是Java并发包的根基,并发包中的锁就是基于AQS实现的。AQS是基于一个FIFO的双向队列,其内部定义了一个节点类Node,Node节点内部的SHARED用来标记该线程是获取共享资源时被阻挂起后放入AQS队列的,EXCLUSIVE用来标记......
  • 高并发场景下的 HttpClient 优化方案,QPS 大大提升!
    HttpClient优化思路:池化长连接httpclient和httpget复用合理的配置参数(最大并发请求数,各种超时时间,重试次数)异步多读源码1.背景我们有个业务,会调用其他部门提供的一个基于http的服务,日调用量在千万级别。使用了httpclient来完成业务。之前因为qps上不去,就看了一下业务代......
  • golang map json 结构体
    要将JSON转换为Go结构体,您可以使用json.Unmarshal()函数。首先,您需要定义一个与JSON数据结构匹配的Go结构体,然后使用json.Unmarshal()将JSON数据解码为该结构体。以下是一个示例:假设有如下JSON数据:{"name":"JohnDoe","age":30,"email":"[email protected]"}......
  • golang之异步队列Asynq
    Asynq[1]是一个Go实现的分布式任务队列和异步处理库,基于redis,类似Ruby的sidekiq[2]和Python的celery[3]。Go生态类似的还有machinery[4]和goworker同时提供一个WebUI asynqmon[5],可以源码形式安装或使用Dockerimage,还可以和Prometheus集成dockerrun--rm--nameasynqmon......
  • 开发者笔记 C++11新特性并发编程future
    上一篇介绍了<thread>文件里线程相关类,这篇将介绍C++<future>头文件里线程类,future里包含的类主要是处理异步任务,线程函数封装,线程间通信,同步,捕捉异常处理https://zhuanlan.zhihu.com/p/509118687future的引入c++11引入的future是为了解决异步通信问题的。future可以看做是数......
  • OpenJDK17-JVM源码阅读-ZGC-并发标记
    1、ZGC简介1.1介绍ZGC是一款低延迟的垃圾回收器,是Java垃圾收集技术的最前沿,理解了ZGC,那么便可以说理解了java最前沿的垃圾收集技术。从JDK11中作为试验特性推出以来,ZGC一直在不停地发展中。从JDK14开始,ZGC开始支持Windows。在JDK15中,ZGC不再是实验功能,可以......