返回顶部
首页 > 资讯 > 精选 >Go中sync包Cond使用场景是什么
  • 188
分享到

Go中sync包Cond使用场景是什么

2023-07-05 08:07:57 188人浏览 安东尼
摘要

本篇内容介绍了“Go中sync包Cond使用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景编写代码过程中, 通常有主协程和多个

本篇内容介绍了“Go中sync包Cond使用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    背景

    编写代码过程中, 通常有主协程和多个子协程进行协作的过程,比如通过 WaitGroup 可以实现当所有子协程完成之后, 主协程再继续执行。

    如上的场景是主协程等待子协程达到某个状态再继续运行。 但是反过来怎么操作呢,要求一组子协程等待主协达到某个状态时才继续运行。这个时候就需要用到 Cond 了

    Cond 简介

    Cond 是和某个条件相关,在条件还没有满足的时候,所有等待这个条件的协程都会被阻塞住,只有这个条件满足的时候,等待的协程才可能继续进行下去。
    Cond 在初始化的时候,需要关联一个 Locker 接口的实例,一般会使用 Mutex 或者 RWMutex。
    Cond 关联的 Locker 实例可以通过 c.L 访问,它内部维护着一个先入先出的等待队列。
    Cond 分别有三个方法

    • Wait

    会把当前协程放入Cond的等待队列中并阻塞,直到被Signal或者Broadcast方法从等待队列中移除并唤醒,用于子协程阻塞。

    • Signal

    主协程唤醒等待队列中的一个子协程,先唤醒最先阻塞的子协程,被唤醒的子协程继续执行。

    • Broadcast

    主协程唤醒等待队列中的全部协程,所有子协程继续执行。

    注意:调用Signal和Broadcast方法,不强求持有c.L的,调用Wait方法是必须要持有c.L的锁。

    使用示例

    Signal的使用场景

    大家都去医院先排队,然后等待叫号,先排队的先叫号。这次模拟有5个病人,分别先排队。 然后护士根据排队先后来叫号;
    具体场景是,5个病人在三秒中之内分别排号,护士今天要叫5个号,一秒叫一个,叫完5个号就结束了
    代码如下:

    package mainimport ("fmt""math/rand""sync""time")func main() {c := sync.NewCond(&sync.Mutex{})num := 0// 当前叫号是几号hand_num := 0for i := 0; i < 5; i++ {go func(i int) {// 分别在不同时间排队time.Sleep(time.Second * time.Duration(rand.Int63n(10)))c.L.Lock()num++// 当前取得号。cur := numfmt.Printf("%s  %d 号病人取到了 %d 号\n", time.Now().FORMat("2006-01-02 15:04:05"), i, cur)// 取到号了,等待叫号c.Wait()fmt.Printf("%s  %d 号病人排队号是 %d 号,被叫号了\n", time.Now().Format("2006-01-02 15:04:05"), i, cur)hand_num = curc.L.Unlock()}(i)}// 都叫号了for hand_num != 5 {// 叫号c.Signal()time.Sleep(time.Second * 1)}time.Sleep(time.Second * 10)}

    执行结果如下

    Go中sync包Cond使用场景是什么

    结果表明,5个病人,分别在三秒钟内先后取号, 然后护士每过一秒钟按照排队的先后顺序叫一个号(叫号的过程依然有病人取号),先取号的被先叫号。
    此场景中,5个病人相当于5个协程, 主协程反复使用Signal() 按照顺序一个个唤醒阻塞的子协程。

    Broadcast的使用场景

    场景为如下: 运动员跑步比赛,要求8秒内全部运动员准备好,然后等待教练发令, 教练10秒后发令,所有运动员在发令后开始跑。

    package mainimport ("fmt""math/rand""sync""time")func main() {c := sync.NewCond(&sync.Mutex{})for i := 0; i < 10; i++ {go func(i int) {// 随机一个8秒内的准备时间time.Sleep(time.Second * time.Duration(rand.Int63n(8)))fmt.Printf("%s 运动员%d已准备就绪\n", time.Now().Format("2006-01-02 15:04:05"), i)c.L.Lock()// 准备完毕,等待教练发令c.Wait()c.L.Unlock()fmt.Printf("%s 运动员%d开跑\n", time.Now().Format("2006-01-02 15:04:05"), i)}(i)}// 主协程等待10秒后发令time.Sleep(time.Second * 10)fmt.Printf("%s 教练发令。\n", time.Now().Format("2006-01-02 15:04:05"))// 教练发令。通知所有运动员开始跑步, 即唤起之前 wait()的所有协程c.Broadcast()// 等待跑步time.Sleep(time.Second * 5)}

    执行结果如下:

    Go中sync包Cond使用场景是什么

    如结果所示, 10个运动员在8秒内分别准备好,等待教练发令后,同时开跑。
    此场景中,10个运动员相当于10个协程, 同时等待主协程的命令,使用Broadcast() 唤醒所有阻塞的子协程。

    注意事项

    使用 Cond,最容易踩的坑就是调用 Wait() 方法之前,调用者没有持有锁或没有检查辅助条件。
    在如上示例代码中,假如把调用 Wait() 方法前后的加锁和释放锁的代码注释掉,运行代码会导致程序 panic。原因是调用 Wait 方法,会先把调用者放入等待队列中,然后释放锁。此时如果在未持有锁时调用释放锁的方法,就会导致程序 panic。

    “Go中sync包Cond使用场景是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: Go中sync包Cond使用场景是什么

    本文链接: https://lsjlt.com/news/350696.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Go中sync包Cond使用场景是什么
      本篇内容介绍了“Go中sync包Cond使用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景编写代码过程中, 通常有主协程和多个...
      99+
      2023-07-05
    • Go中sync 包Cond使用场景分析
      目录背景Cond 简介使用示例Signal的使用场景Broadcast的使用场景注意事项背景 编写代码过程中, 通常有主协程和多个子协程进行协作的过程,比如通过 WaitGroup ...
      99+
      2023-03-03
      Go 使用 sync.cond go sync包cond使用
    • java中@Configuration使用场景是什么
      这篇文章主要讲解了“java中@Configuration使用场景是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java中@Configuration使用场景是什么”吧!一、简单介绍@...
      99+
      2023-07-05
    • RabbitMQ使用场景是什么
      这篇文章主要介绍“RabbitMQ使用场景是什么”,在日常操作中,相信很多人在RabbitMQ使用场景是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”RabbitMQ使用场景是什么”的疑惑有所帮助!接下来...
      99+
      2023-06-26
    • Mysql中锁的使用场景是什么
      这篇文章主要讲解了“Mysql中锁的使用场景是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mysql中锁的使用场景是什么”吧!一、常见锁类型表级锁,锁...
      99+
      2024-04-02
    • Redis的使用场景是什么
      这篇文章主要介绍“Redis的使用场景是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis的使用场景是什么”文章能帮助大家解决问题。Redis常用命令总结:包括时间复杂度总结与具体数据类型...
      99+
      2023-06-02
    • Golang error使用场景是什么
      本篇内容主要讲解“Golang error使用场景是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang error使用场景是什么”吧!在Go的编程中, error...
      99+
      2023-07-05
    • npm打包和重定向在go语言中的应用场景是什么?
      随着互联网的不断发展,前端技术也变得越来越重要。前端技术中最重要的一项就是打包。打包可以将多个文件打包成一个文件,这样可以减少文件请求的次数,提高网页的加载速度。在前端开发中,最常用的打包工具就是npm。而在后端开发中,使用go语言开发的...
      99+
      2023-10-14
      npm 打包 重定向
    • vue使用slot的场景是什么
      这篇文章主要介绍“vue使用slot的场景是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue使用slot的场景是什么”文章能帮助大家解决问题。使用场景:通过slot(插槽)可以让用户可以拓展...
      99+
      2023-07-05
    • java SPI的使用场景是什么
      本文小编为大家详细介绍“java SPI的使用场景是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“java SPI的使用场景是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概念SPI是服务提供界面,JD...
      99+
      2023-06-30
    • Confd和Consul使用场景是什么
      这篇文章主要介绍了Confd和Consul使用场景是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Confd和Consul使用场景是什么文章都会有所收获,下面我们一起来看看吧。Confd和Consul是什么...
      99+
      2023-07-05
    • GO语言中通道和sync包如何使用
      这篇文章主要讲解了“GO语言中通道和sync包如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“GO语言中通道和sync包如何使用”吧!GO通道和 sync 包的分享我们一起回顾一下上次...
      99+
      2023-07-05
    • Vue3中reactive与ref函数使用场景是什么
      本文小编为大家详细介绍“Vue3中reactive与ref函数使用场景是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue3中reactive与ref函数使用场景是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习...
      99+
      2023-07-02
    • React中memo、useCallback和useMemo的使用场景是什么
      这篇“React中memo、useCallback和useMemo的使用场景是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
      99+
      2023-07-05
    • RabbitMQ原理以及使用场景是什么
      本篇文章给大家分享的是有关RabbitMQ原理以及使用场景是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一. RabbitMQ 简介MQ...
      99+
      2024-04-02
    • ThreadLocal的原理和使用场景是什么
      ThreadLocal是Java中的一个类,用于在多线程环境中实现线程内部的数据共享。它提供了一个线程局部变量,每个线程都可以独立地...
      99+
      2023-09-12
      ThreadLocal
    • JSON Schema概念及使用场景是什么
      本篇内容介绍了“JSON Schema概念及使用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.什么是JSON Sch...
      99+
      2023-07-02
    • Spring @Bean注解的使用场景是什么
      本篇内容介绍了“Spring @Bean注解的使用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简单介绍翻看Spri...
      99+
      2023-07-05
    • 在SQL Server中PowerShell脚本的使用场景是什么
      在SQL Server中使用PowerShell脚本的一些常见场景包括: 管理和监控数据库:可以使用PowerShell脚本来执行数据库备份、恢复、清理日志等操作,以及监控数据库的性能和状态。 自动化任务和作业:可以使用PowerS...
      99+
      2024-06-03
      sql server
    • Redis的应用场景是什么
      小编给大家分享一下Redis的应用场景是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一丶Redis介绍Redis是一个开源...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作