首页 > 其他分享 >golang之sync包

golang之sync包

时间:2023-08-04 15:36:26浏览次数:34  
标签:wg task 协程 worker sync golang Done

介绍sync包中常用的方法, 

- sync:提供基本的同步原语(比如Mutex、RWMutex、Locker)和 工具类(Once、WaitGroup、Cond、Pool、Map)
- sync/atomic:提供变量的原子操作(基于硬件指令 compare-and-swap)

 

[Once]

 

[WaitGroup]

 

一个 WaitGroup 对象可以等待一组协程结束。使用方法是:

  1. main协程通过调用 wg.Add(delta int) 设置worker协程的个数,然后创建worker协程;
  2. worker协程执行结束以后,都要调用 wg.Done()
  3. main协程调用 wg.Wait() 且被block,直到所有worker协程全部执行结束后返回。

实例:

 func  main() {
      // 省略部分代码 ...
      var wg sync.WaitGroup
      for _, task := range tasks {
        task  := task
        wg.Add(1)
        go func() {
          task()
          defer wg.Done()
        }()
      }
      wg.Wait()
      // 省略部分代码...
    }

说明:

1.wg.Done 必须在wg.Add之后执行

2.wg.Done在worker协程中调用, 保证调用一次,不能因为panic或者其他原因导致没有执行(建议使用defer wg.Done)

3.task := task 需要进行再次赋值,否则会读取到最后一个元素的值(

  1. for-loop 内创建的局部变量,即便名字相同,内存地址也不会复用

)

 

适用场景:

1.需要向多个服务请求数据,并最终将这些服务请求结果进行最终整合返回给前端进行展示

 

 

[Cond]

 

[Pool]

 

[Map]

 

[sync/atomic] 原子相关操作

 

标签:wg,task,协程,worker,sync,golang,Done
From: https://www.cnblogs.com/xingxia/p/golang_sync.html

相关文章

  • Golang 使用 JSON unmarshal 数字到 interface{} 数字变成 float64 类型
    最近在golang业务开发时,遇到一个坑。我们有个服务,会接收通用的interface对象,然后去给用户发消息。因此会涉及到把各个业务方传递过来的字符串,转成interface对象。但是因为我的字符串里有一个数字,比如下面demo里的{"number":1234567},而且数字是7位数,在经过json.Unmarshal后,被转成......
  • VScode 中golang 基准测试 go test -bench .
    目的:基准测试的主要目的是比较不同实现方式之间的性能差异,找出性能瓶颈。1准备以_test.go结尾文件和导入testing包在命名文件时需要让文件必须以_test结尾,在文件中导入testing包。基准测试可以测试一段程序的运行性能及耗费CPU的程度,获得代码内存占用和运行效率的性能数据。G......
  • [async]子线程内开启协程 RuntimeError: There is no current event loop in thread '
    在子线程内直接获取事件循环会报错:RuntimeError:Thereisnocurrenteventloopinthread'Thread-2',此时的代码为:loop=asyncio.get_event_loop()loop.run_until_complete(协程函数) #执行解决方法:在子线程内创建并配置事件循环new_loop=asyncio.new_event_loop(......
  • async装饰器
    1.异步无参装饰器importtimefromfunctoolsimportwrapsdeftotal_time(func):@wraps(func)asyncdefwrapper(*args,**kwargs):start=time.time()res=awaitfunc(*args,**kwargs)print(f'RUNTIME:{time.time()-start}')return......
  • asyncio的subprocess使用
    1.asyncio的subprocessasyncio提供了两个开箱即用的协程函数来创建子进程,这些协程函数都返回一个Process实例1.asyncio.create_subprocess_exec(),用于直接运行命令(如ls、pwd、who、python3、go等)。2.asyncio.create_subprocess_shell(),用于通过shell运行命令。cre......
  • 如何在 React 18 中使用 useSyncExternalStore
    原文useSyncExternalStore是React18中提供的自定义挂钩,可让您订阅外部存储并在外部存储更新时更新您的React组件。它对于订阅不是建立在React状态管理之上的外部存储特别有用。useSyncExternalStoreAPI您应该在组件的顶层调用useSyncExternalStore方法import{useSyncExte......
  • 使用Rsync进行双机热备
              ......
  • 我用 GPT-4 生成了性能全网第一的 Golang Worker Pool,轻松打败 GitHub 万星项目
    目录1.我写了一个超牛的开源项目1.1你看看这性能1.2你看看这功能1.3你猜我这一百天都经历了啥2.你有多久没写并发程序了?3.问:一个WorkerPool程序需要包含哪些功能?4.让GPT-4写第一行代码!4.1我对GPT-4说4.2GPT-4回答4.3我又对GPT-4说4.4GPT-4......
  • golang用pgx查询数据时如何将查询结果方便的放入Map中
    pgx库简介下面是来自官网的简介:pgx-PostgreSQL驱动和工具包pgx是一个用于PostgreSQL的纯Go语言驱动和工具包。pgx驱动是一个底层的高性能接口,暴露了PostgreSQL特有的功能,如LISTEN/NOTIFY和COPY。它还包含一个标准database/sql接口的适配器。工具包组件是一组相关的包,实......
  • Golang反射type和kind有什么区
    一、前言Go语言中的反射是由reflect包提供支持的,它定义了两个重要的类型Type和Value。任意值在反射中都可以理解为由reflect.Type和reflect.Value两部分组成,并且reflect包提供了reflect.TypeOf和reflect.ValueOf两个函数来获取任意对象的Value和Type。在Go语......