文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么使用go带缓冲chan实现消息队列功能

2023-07-05 07:11

关注

本篇内容介绍了“怎么使用go带缓冲chan实现消息队列功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1、Channels 定义

通道是一种支持多类型的管道,您可以通过它使用通道运算符 <- 发送和接收值。

数据沿箭头方向流动。

ch <- v    // Send v to channel ch.v := <-ch  // Receive from ch, and           // assign value to v.

与 maps 和 slices 一样,通道必须在使用前创建:

ch := make(chan int)

默认情况下,发送和接收阻塞,直到另一方准备就绪。
这允许 goroutines 在没有显式锁或条件变量的情况下进行同步。

package mainimport "fmt"func sum(s []int, c chan int) {    sum := 0    for _, v := range s {        sum += v    }    c <- sum // send sum to c}func main() {    s := []int{7, 2, 8, -9, 4, 0}    c := make(chan int)    go sum(s[:len(s)/2], c)    go sum(s[len(s)/2:], c)    x, y := <-c, <-c // receive from c    fmt.Println(x, y, x+y)}

2、chan 常用操作

3、带缓冲chan实现消息队列功能

// 监测数据结构体type Msg struct {    Timestamp    int64    Content        string        }// 用 chan 模拟队列,队列的元素为 Msg 类型var SyncQueen chan Msg// 必须初始化才能使用。初始化一个容量为1024的 chan。chan 满时会阻塞func init() {    SyncQueen = make(chan Msg, 1024)}
// 队列消费者func Consumer() {    defer func() {        if err := recover(); err != nil {            fmt.Println(err)        }    }()    for {        // chan 内无消息则阻塞        msg := <-SyncQueen        fmt.Println(msg.Content)    }}
// 队列生产者func Producer() {    for {        msg := Msg(time.now().Unix(), "hello")                // 发送消息到 chan        SyncQueen <- msg        time.Sleep(2 time.Second)    }}

重点

多协程使用chan是并发安全的,以下展示一个简单的例子:

// 定义类型为 int 的 chanvar chanNums chan int// chan 的消费者,用户后续多协程// 目的:数组里存储了10000个数字,多个协程并行计算后,把和加起来func consumer(sum *int) int {    for {        v := <-chanNums        *sum += v    }}//-------------------------------------func main() {    var a [10000]int    for i := 0; i < 10000; i++ {        a[i] = i + 1    }    chanNums = make(chan int, 10000)    for i := 0; i < 10000; i++ {        chanNums <- (i + 1)    }    var s1, s2, s3, s4, s5 int = 0, 0, 0, 0, 0    go consumer(&s1)    go consumer(&s2)    go consumer(&s3)    go consumer(&s4)    go consumer(&s5)    for {        time.Sleep(5 * time.Second)        break    }    fmt.Println("s1=", s1, "s2=", s2, "s3=", s3, "s4=", s4, "s5=", s5)    fmt.Println("sum=", s1+s2+s3+s4+s5)}// 输出s1= 10818438 s2= 12073966 s3= 9044041 s4= 11509634 s5= 6558921sum= 50005000

“怎么使用go带缓冲chan实现消息队列功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯