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

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

时间:2024-03-24 15:47:32浏览次数:15  
标签:访问控制 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

相关文章

  • Golang:无锁队列实现
    无锁队列实现无锁队列实现参考论文适用场景并发条件下,需要使用到队列的情况,都可以使用无锁队列技术要点使用atomic.loadpointer来实现实时的指针相等判断使用CAS来替代同步状态下的p=p.next额外判断tail是不是正确的tail,并且不断地尝试推后他示例代码pack......
  • Golang: 通过chan来实现并发访问控制
    通过chan来实现并发访问控制通过chan来实现并发访问控制背景介绍这是在阅读grom的源码时,他的schema的初始化方式,给我留下来很深刻的印象,本文将通过channel的一些使用来实现实例的并发访问技术要点如果chan为空时,尝试读可以成功,获得的结果为空示例代码packagemai......
  • 中考英语首字母快速突破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......