当前位置: 首页 > news >正文

莆田市城厢区建设局网站网站建设管理职责

莆田市城厢区建设局网站,网站建设管理职责,天天广告联盟官网,新发布的新闻GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Http) 11、GO学习之 微框架(Gin) 12、GO学习之 数据库(mysql) 13、GO学习之 数据库(Redis) 14、GO学习之 搜索引擎(ElasticSearch) 15、GO学习之 消息队列(Kafka) 16、GO学习之 远程过程调用(RPC) 17、GO学习之 goroutine的调度原理 18、GO学习之 通道(nil Channel妙用) 19、GO学习之 同步操作sync包 文章目录 GO系列前言一、channel 和 sync包1.1 channel 和 sync包性能测试1.2 channel 和 sync包如何选择 二、sync包使用注意事项三、sync.Mutex 原理四、小结 前言 按照公司目前的任务go 学习是必经之路了虽然行业卷不过技多不压身依旧努力 同步操作在并发中是必不可少的的若对一些公用的资源进行操作为了保证操作的原子和一致性就需要使用到锁来进行控制。 Go 语言在提供CSP通信顺序进程并发模型原语的的同时还提供了标准库 sync包 针对传统基于共享内存并发模型的同步原语包括 互斥锁sync.Mutex、读写锁sync.RWMutex、条件锁sync.Cond等。 一、channel 和 sync包 Go 语言提倡不要通过共享内存来通信而是要通过通信来共享内存一般的场景中先使用 CSP 并发模型实现就是 goroutine channel 编程。但也有一些特殊的场景需要 sync包 提供的低级同步原语。在 Go 中channel 属于高级同步原语其实现是建立在低级同步原语之上的所以 channel 自身的性能与低级同步原语相比要稍微逊色一点了。因此在需要需要高性能的情况下sync包 提供的低同步原语更为重要。 1.1 channel 和 sync包性能测试 我们来对 channel 和 sync包 的性能做一个对比示例代码如下channel_sync_test.go 注意 基准测试代码文件必须是_test.go结尾和单元测试一样基准测试的函数以Benchmark开头参数为 *testing.B基准测试函数不能有返回值b.ResetTimer是重置计时器这样可以避免for循环之前的初始化代码的干扰b.N是基准测试框架提供的是循环次数无需关心go test -bench . .\channel_sync_test.go 运行 package mainimport (synctesting )var data 0// 声明互斥锁 var mu sync.Mutex// 声明一个通道 var ch make(chan struct{}, 1)func syncByMutex() {mu.Lock()datamu.Unlock() }func syncByChannel() {ch - struct{}{}data-ch }// 基准测试函数以 Benchmark 开头 func BenchmarkSectionByMutex(b *testing.B) {for i : 0; i b.N; i {syncByMutex()} }// 基准测试函数以 Benchmark 开头 func BenchmarkSectionByChannel(b *testing.B) {for i : 0; i b.N; i {syncByChannel()} } 运行结果 PS D:\workspaceGo\src\sync go test -bench . .\channel_sync_test.go goos: windows goarch: amd64 cpu: Intel(R) Core(TM) i5-8300H CPU 2.30GHz BenchmarkSectionByMutex-8 79662760 13.15 ns/op BenchmarkSectionByChannel-8 27814993 40.38 ns/op PASS ok command-line-arguments 2.523s从运行结果中看BenchmarkSectionByChannel 测试函数是 40.38 ns/opBenchmarkSectionByMutex 是 13.15 ns/op很明显 sync包 的的性能更佳。 1.2 channel 和 sync包如何选择 同步访问 channel 的并发设计的特点是在 goroutine 间通过 channel 转移数据对象的所有权。只有获得了数据对象的所有权就是从 channel 中获得该对象才可以对数据对象进行状态变更。如果设计中没有转移结构体对象所有权但又要保证结构体内部状态能在多个 goroutine 之间同步那么你可以使用 sync包 提供的低级同步原语来实现比如 sync.Mutex互斥锁。 二、sync包使用注意事项 在 sync 包中有这么些注释 Values containing the types defined in this package should not be copied. 不应该包含那些包含了此包中类型的值A Mutex must not be copied after first use. 禁止复制首次使用后的 Mutex 还有其他 sync包 中也有诸如此类注释那是为什么呢我们来进行一个小 demo package mainimport (logsynctime )// 声明一个结构体 data type data struct {n intsync.Mutex }func main() {// 声明一个结构体对象 dd : data{n: 100}// 启动一个线程进行加锁操作go func(d data) {for {log.Println(go 2 try to lock...)d.Lock()log.Println(go 2 locked ok...)time.Sleep(3 * time.Second)d.Unlock()log.Println(go 2 unlock ok...)}}(d)d.Lock()log.Println(go main lock ok...)// 在 Mutex 首次使用后复制值go func(d data) {log.Println(go 1 try lock...)d.Lock()log.Println(go 1 locked ok...)time.Sleep(3 * time.Second)d.Unlock()log.Println(go 1 unlock ok...)}(d)time.Sleep(1000 * time.Second)d.Unlock()log.Println(go main unlock ok...) }运行结果 PS D:\workspaceGo\src\sync go run .\sync.go 2023/11/04 16:57:24 go main lock ok... 2023/11/04 16:57:24 go 2 try to lock... 2023/11/04 16:57:24 go 2 locked ok... 2023/11/04 16:57:24 go 1 try lock... 2023/11/04 16:57:27 go 2 unlock ok... 2023/11/04 16:57:27 go 2 try to lock... 2023/11/04 16:57:27 go 2 locked ok... 2023/11/04 16:57:30 go 2 unlock ok... 2023/11/04 16:57:30 go 2 try to lock... 2023/11/04 16:57:30 go 2 locked ok... ...在示例中创建了两个 goroutine go 1 和 go 2从运行结果中看到 go 1 阻塞在了加锁操作上了则 go 2 则是按照预期正常运行。go 1 和 go 2 的区别就在于 go 2 是在互斥锁首次使用之前创建的而 go 1 则是在互斥锁加锁操作并且在锁定状态之后创建的并且程序在创建 go 1的时候复制了 data 的实例并且使用了这个副本。 三、sync.Mutex 原理 我们可以在 $GOROOT/src/sync/mutex.go 源码中看到如下声明语句 type Mutex struct {state int32sema uint32 }其实 sync.Mutex 的实现很简单定义了两个字段 state 和 sema。 state表示当前互斥锁的状态sema用户控制状态的信号量 对Mutex实例的复制即是对两个整型字段的复制。在初始状态下Mutex 示例处于 Unlocked 状态state:0sema0上述案例中go 2 在复制了初始状态的 Mutex 实例副本的 state 和 sema 均为 0则与 go 2新定义的 Mutex 无异则go 2可以继续正常运行。 后续主程序调用了 Lock 方法Mutex 实例变为 Locked 状态而此后 go 1 创建是恰恰复制了处于 Locked 状态的实例那副本实例也是 Locked 状态的所以 go 1 进去了阻塞状态也是死锁状态因为没有任何机会调用 Unlock 了。 四、小结 通过本文案例可以直观的看到sync包中的实例在首次实例化后被复制的副本一旦被使用了将导致不可预期的结果。所以在使用 sync包 的时候推荐通过 闭包 或者 传递类型实例 的地址或指针的方式进行这是使用 sync包 需要注意的地方。 现阶段还是对 Go 语言的学习阶段想必有一些地方考虑的不全面本文示例全部是亲自手敲代码并且执行通过。 如有问题还请指教。 评论去告诉我哦一起学习一起进步
http://www.dnsts.com.cn/news/264047.html

相关文章:

  • 做公司网站哪家好 上海谈谈设计和建设网站体会
  • 广西哪家公司做网站的最优化方法
  • 网站做联盟还赚钱吗微信平台开发公司成都
  • 东昌府聊城网站建设杭州公司网站建设
  • 用c 做网站企信网是什么网站
  • 成品网站免费模板做网站内页图片尺寸
  • 鞋子网站建设规划书wordpress默认页面设置方法
  • 分享设计作品网站有做电动车修车的网站吗
  • 小语种建网站建设万网人网站备案流程
  • html5手机网站开发教程龙采做网站要多少钱
  • 黄岛区网站建设域名免费注册网站
  • 吴江企业网站建设国外网站服务器建设
  • 郴州专业的网站建设如何自己做视频网站
  • 怎么做自己的网站网站 建设服务器
  • 有些网站做不了seo网站开发文档管理工具
  • 深圳市网站建设有补贴吗两人合伙做网站但不准备开公司
  • 做初级会计实务题的网站在哪个网站上可以学做衣服
  • 帝国cms做网站流程linux系统网站建设
  • 邯郸做网站推广的地方如何查看一个网站的所有二级域名
  • 东莞网站设计四川酒店网站建设
  • 作品展示html5网站模板企业网站开发要学什么
  • 朝阳网站开发联系电话帝国cms转换wordpress
  • 阿里云虚拟主机可以做几个网站吗wordpress 提速
  • 商务网站开发流程苏州长尾词seo排名优化
  • 网站seo方法大棚建设的网站
  • 高端大气网站源码wordpress 热搜词
  • 网站制作怎么做深圳公司查询
  • 一 美食 视频网站模板下载安装长沙五百强企业名单
  • 代客做网站简历表电子版模板下载
  • 专业做网站公司24小时接单哪个选项不属于网络营销的特点