首页 > 其他分享 >golang之协程+chan通道

golang之协程+chan通道

时间:2023-08-11 18:00:57浏览次数:39  
标签:之协程 协程 缓冲 chan golang 死锁 go

 

[管道]

分为 有缓冲和无缓冲两种

无缓冲: 

1)接受者与发送者必然存在于两个协程, 否则会造成互相等待 死锁的情况

顺序执行多协程:

var ch1 = make(chan int)

    var stopFlag = make(chan bool)
    // 保证两个协程顺序执行

    go func() {
        fmt.Println("g1")
        time.Sleep(3 * time.Second)
        ch1 <- 1
    }()

    go func() {
        <-ch1
        fmt.Println("g2")
        time.Sleep(1 * time.Second)
        stopFlag <- true
    }()

    <-stopFlag
    fmt.Println("over")

 

有缓冲:

1.允许同一个协程中, 顺序执行, 但是保证发送的数量与接收的数量相等,否则会造成死锁

 

[协程]

实例:

go funct(){
    ...
}()

 

 

 

实现主进程Hold的方式

1)使用无缓冲的channel, 异常情况下实现终止操作,例如gin框架保证服务的异常中断之后的处理

2)使用select{} 即可

 

标签:之协程,协程,缓冲,chan,golang,死锁,go
From: https://www.cnblogs.com/xingxia/p/golang_goroutine_channel.html

相关文章

  • golang 学习笔记
    1.函数调用时传递的参数为拷贝的副本,在函数内部改变参数的值不会影响原变量。但是golang中slice、map、channel、pointer、function是引用类型,赋值时拷贝的是指针值,对这些变量作出修改时会影响原变量的值。2.array(数组)与slice(切片)的区别1.array1. 长度......
  • Golang - 原生go-sql-driver:出现invalid connection报错
    在使用go-sql-driver/msqyl驱动过程中,偶现invalidconnection错误,字面上看就是无效连接的意思。开始以为是数据库压力问题或是网络不好,后来发现服务器和数据库是走内网的,网络出现问题几率非常小;只是在测试服务器上跑,没多少连接,不存在压力问题。golang数据库驱动维护一个连接池,如......
  • 链接Mongodb报错Unable to authenticate using sasl protocol mechanism SCRAM-SHA-1
    解决方案在连接数据库字符串后面添加authSource=admin  "MongoDB":{"Host":"mongodb://touchadmin:[email protected]:27017/TouchAdmin?authSource=admin","DbName":"TouchAdmin"} useTouchAdmindb.cre......
  • Golang 绘图技术(image/draw包介绍)
     image/draw包仅仅定义了一个操作:通过可选的蒙版图(maskimage),把一个原始图片绘制到目标图片上,这个操作是出奇的灵活,可以优雅和高效的执行很多常见的图像处理任务。1://DrawcallsDrawMaskwithanilmask.2:funcDraw(dstImage,rimage.Rectangle,srcimage.Image......
  • 使用golang解决LeetCode热题Hot100(1-10)
    使用golang解决LeetCode热题Hot1001.两数之和https://leetcode.cn/problems/two-sum/题目给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个......
  • Fanout Exchange
    在订阅模型中,多了一个exchange角色,而且过程略有变化:Publisher:生产者,也就是要发送消息的程序,但是不再发送到消息队列中,而是发送给交换机Exchange:交换机,接收生产者发送的消息,知道如何处理消息,如:递交给某个队列、递交给所有队列、或是将消息丢弃。如何操作,取决于Exchange的类型。Excha......
  • golang自定义 os.stderr 数据读取逻辑
    原始需求只是一个很简单的需求,使用golang的exec运行一个命令然后获取实时结果,命令是trivyimage--download-db-only正常的打印应该是2023-08-08T17:06:02.929+0800INFONeedtoupdateDB2023-08-08T17:06:02.929+0800INFODBRepository:ghcr.io/aquas......
  • golang之操作kafka
     安装第三方包:gogetgithub.com/IBM/sarama 生产者实例:packagemainimport("fmt""github.com/IBM/sarama")funcmain(){//1.生产者配置config:=sarama.NewConfig()config.Producer.RequiredAcks=sarama.WaitForAll/......
  • 第五节:EF Core中的三类事务(SaveChanges、DbContextTransaction、TransactionScope)
    第五节:EFCore中的三类事务(SaveChanges、DbContextTransaction、TransactionScope)原文链接:https://blog.csdn.net/weixin_30954265/article/details/101542615?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-10154......
  • prometheus的sdk client_golang 使用 定时器
    之前线上监控的agent都是直接  time.Sleep(time.Duration(collectInterval)*time.Second),多少有些许的low,每次开始采集数据的时间都是从程序开始执行就开始采集,很显然这种偷懒的方式是不合理的。1、简单复制粘贴一下funcAbNormalLoglistener(collectIntervalint){......