首页 > 其他分享 >Golang: 通过chan来实现并发访问控制

Golang: 通过chan来实现并发访问控制

时间:2024-03-24 15:33:21浏览次数:20  
标签:访问控制 Demo chan Golang 并发 func time

通过chan来实现并发访问控制

通过chan来实现并发访问控制

背景介绍

这是在阅读grom的源码时, 他的schema的初始化方式, 给我留下来很深刻的印象, 本文将通过channel的一些使用来实现实例的并发访问

技术要点

如果chan为空时, 尝试读可以成功, 获得的结果为空

示例代码

package main

import (
  "sync"
  "time"
)

type Demo struct {
  inited chan struct{}
  a      int
}

func (i *Demo) Init() {
  defer close(i.inited)

  i.a = 100
  time.Sleep(time.Second * 2)
}

func (i *Demo) GetInstance() int {
  <-i.inited

  return i.a
}

func main() {
  demo := &Demo{inited: make(chan struct{})}
  waitGroup := sync.WaitGroup{}
  waitGroup.Add(6)
  go func() { defer waitGroup.Done(); demo.Init() }()
  go func() { defer waitGroup.Done(); println(demo.GetInstance()) }()
  go func() { defer waitGroup.Done(); println(demo.GetInstance()) }()
  go func() { defer waitGroup.Done(); println(demo.GetInstance()) }()
  go func() { defer waitGroup.Done(); println(demo.GetInstance()) }()
  go func() { defer waitGroup.Done(); println(demo.GetInstance()) }()
  waitGroup.Wait()
}

标签:访问控制,Demo,chan,Golang,并发,func,time
From: https://www.cnblogs.com/pDJJq/p/18092493/implementation-of-concurrent-access-control-throu

相关文章

  • 中考英语首字母快速突破014-2021上海徐汇英语二模-Future Changes: Predictions and P
    PDF格式公众号回复关键字:ZKSZM014原文​Readthecommentsaboutchangesinthefuture.Howmuchdoyouagreewiththem?​Thedays,somepeopleworkathomeoneortwodaysaweekinsteadofgoingtoanofficeeveryday.Ithinkinthefuture......
  • Golang: 探究sync.map的实现
    Golang:探究sync.map的实现背景探究下载并发模式下,sync.map的实现,以及该实现方式可能引入的问题链接Github基本使用packagemainimport"sync"funcmain(){ m:=sync.Map{} m.Load("key") m.Store("key","value") m.LoadOrStore("key",&q......
  • Golang标准库fmt深入解析与应用技巧
    Golang标准库fmt深入解析与应用技巧前言fmt包的基本使用打印与格式化输出函数Print系列函数格式化字符串格式化输入函数小结字符串格式化基本类型的格式化输出自定义类型的格式化输出控制格式化输出的宽度和精度小结错误处理与fmt使用fmt.Errorf生成错误信息fmt包与错......
  • golang interface转int
    varres[]orm.Params//切片map,value为interface;//获取当前时间now:=time.Now()//获取30天前的时间thirtyDaysAgo:=now.AddDate(0,0,-30)//将时间转换为时间戳timestamp:=thirtyDaysAgo.Unix()sql:=fmt.Sprint("SELECTcount(*)asnum,media.idasarticle_id,m......
  • Golang: Redislock源码分析
    Golang:Redislock源码分析源码https://github.com/bsm/redislock实现Lua脚本obtain.lua--obtain.lua:arguments=>[value,tokenLen,ttl]--Obtain.luatrytosetprovidedkeys'swithvalueandttliftheydonotexists.--Keyscanbeoverrideniftheyal......
  • 游戏开发:移植golang共享库 for lua
    一些奇奇怪怪的尝试:)随笔记录下将golang模块导出为共享库供lua使用(一般用于功能模块适配和迁移),这里给出一个借助c语言实现中间层通信的方案(不要问我为什么不使用ffi)。假设使用go实现底层模块core,export相关API(如下例的G_Signature)供外部使用,这里是被C层使用。那么需要将go模块编......
  • 【Golang星辰图】实现弹性微服务架构:使用go-micro和go-kit构建可扩展的网络应用
    构建高效网络应用:探索分布式系统和微服务的利器前言在当今的互联网时代,构建可扩展且可靠的网络应用变得越来越重要。分布式系统和微服务架构成为了解决大规模应用程序开发和管理的有效方法。本文将介绍一些用于构建分布式系统和微服务的关键工具和库,例如go-rpc、go-micro......
  • 8.Golang中的运算符-算术运算符、关系运算符、逻辑运算符、赋值运算符
    Golang中的运算符1、Golang内置的运算符算术运算符关系运算符逻辑运算符位运算符赋值运算符2、算数运算符运算符描述+相加-相减*相乘/相除%求余=被除数-(被除数/除数)*除数注意:++(自增)和--(自减)在Go语言中是单独的语句,并不是运算符。pa......
  • 7.GoLang中基本数据类型之间的转换
    GoLang中基本数据类型之间的转换1、关于golang中的数据类型转换Go语言中只有强制类型转换,没有隐式类型转换。2、数值类型之间的相互转换数值类型包括:整形和浮点型packagemainimport"fmt"funcmain(){varaint8=20varbint16=40varc=int16......
  • [GPT] swoole的协程和golang的协程有什么区别,哪个更好
    Swoole的协程和Golang(Go语言)的协程(Goroutine)在概念上都是为了实现轻量级的并发编程,但它们在具体实现、使用方式和性能特点上有所不同:实现原理:Golang协程(Goroutine):Go语言从语言层面内置了对协程的支持。Goroutine是由Go运行时系统管理的轻量级线程,它基于M:N调度模型......