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

网站平台建设工作汇报怎样做网站用html

网站平台建设工作汇报,怎样做网站用html,电商运营 网站运营,帝舵手表官方网站文章目录 Channel声明存入取出一个简单的死锁分析 个人博客:CSDN博客 Channel Channel本质是一个队列多goroutine访问时不需要加锁,Channel天然线程安全channel有类型,只能写入相同类型channel是引用类型channel必须初始化才能写入数据&…

文章目录

    • Channel
      • 声明
      • 存入取出
      • 一个简单的死锁分析

  • 个人博客:CSDN博客

Channel

  • Channel本质是一个队列
  • 多goroutine访问时不需要加锁,Channel天然线程安全
  • channel有类型,只能写入相同类型
  • channel是引用类型
  • channel必须初始化才能写入数据,make分配内存

声明

  • 	var intChan chan intintChan = make(chan int, 3)
    
  • java不是很熟悉,感觉chan有点像java的原子类

存入取出

  • intChan<- xxx //存入
    a := <= intChan//取出
    
  • 管道不会自然增长,不能超过容量,不能从空的管道里取出数据,会上DeadLock

  • 如果想要存储任意类型的管道,可以用空借口

  • var allChan chan interface{}
    
  • 但是,取出的时候注意类型断言

  • close(intChan)
    
  • channel关闭之后就不能再写入了,但是能继续读出

  • 关闭之后能用for-range来遍历,如果不关闭的话会出现死锁

  • 死锁的情况很多,建议多找几篇文章看看,写写实操一下

  • 空的缓冲chan相当于无缓冲的chan,无缓冲的chan需要接收者,传入者,否则就会死锁,注意及时关闭

  • 只向管道内写入,不读取就会deadlock,读得慢没有关系

  • 关键是要给每个管道安排一个发送者,和接收者!!!

一个简单的死锁分析

package mainimport ("fmt""time"
)func write(intChan chan int) {for i := 0; i < 5; i++ {fmt.Println("写入: ", i)intChan <- itime.Sleep(time.Second)}//close(intChan)
}func read(intChan chan int, exitChan chan bool) {for {val, ok := <-intChanif !ok {break}fmt.Println("读到", val)}exitChan <- trueclose(exitChan)
}
func main() {intChan := make(chan int, 20)exitChan := make(chan bool, 1)go write(intChan)go read(intChan, exitChan)for {_, ok := <-exitChanif !ok {break}}
}
  • 输出
写入:  0
读到 0
写入:  1
读到 1
写入:  2
读到 2
写入:  3
读到 3
写入:  4
读到 4
fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]:
main.main()E:/JetBrains/GoLandSpace/src/go_code/project01/main/hello.go:36 +0xe8goroutine 7 [chan receive]:
main.read(0x0?, 0x0?)E:/JetBrains/GoLandSpace/src/go_code/project01/main/hello.go:19 +0x99
created by main.mainE:/JetBrains/GoLandSpace/src/go_code/project01/main/hello.go:33 +0xd9Process finished with the exit code 2
  • 下面是个人的分析,不一定对,有大佬可以来指正
  • 如果我们不close,channel是可以读的,我们可以边读,边写,并且,读的速度是可以更慢或者更快的,go底层会通过上下文自行判断。
  • 但是这里,我们写的协程,我们关闭channel,在程序运行完之后自行关闭,此时我们读的协程会卡在intChan,等待读入,但是此时还不会报错,因为协程会因为主线程结束而结束。但是后面的exitChan会导致报错
package mainimport ("fmt""time"
)func write(intChan chan int) {for i := 0; i < 5; i++ {fmt.Println("写入: ", i)intChan <- itime.Sleep(time.Second)}//close(intChan)
}func read(intChan chan int, exitChan chan bool) {for {val, ok := <-intChanif !ok {break}fmt.Println("读到", val)}fmt.Println("到了这里")//exitChan <- true//close(exitChan)
}
func main() {intChan := make(chan int, 20)exitChan := make(chan bool, 1)go write(intChan)go read(intChan, exitChan)time.Sleep(time.Second * 10)//for {//	_, ok := <-exitChan//	if !ok {//		break//	}//}
}
  • 这样并没有报错,并且发现到了这里没有打印,说明read函数作为intChan的接收者一直在等待,这时候。

  • 但是,主线程运行到下面的for的时候,此时exitChan是空的,因为intChan一直在死循环等待,所以触发了死锁

  • 只读只写

  • var chanIn chan<- int//只写
    
  • var chanOut <-chan int//只读
    
  • select {case …}可以安全地取出数据

  • 使用recover捕获协程终端 panic

http://www.yayakq.cn/news/919499/

相关文章:

  • 用什么语言能写网站吗做一款网站注意啥
  • 广西平台网站建设报价wordpress播放器样式
  • 网站建设修饰商品微信小程序开发教程从零开始
  • 下载网站的服务器文件设计图片logo免费
  • 微信公众号怎么进行网站建设流量主广告点击自助平台
  • 网站建设可以资本化吗许昌网站设计制作
  • 做网站常熟网站流量盈利
  • 少儿编程加盟费一般多少钱系统优化大师下载
  • 新闻类网站怎么建设怎样做招嫖网站
  • 网站推广费用一般多少钱深圳开发软件公司
  • 杭州优化网站网站怎么申请怎么注册
  • 佛山大型的网站制作ip子域名大全
  • 什么样的网站可以做站群厦门易尔通做网站怎么样
  • 六安找人做网站扬中新网网
  • 北京视频网站建设网站关键词优化互点
  • 织梦网站模板如何安装怎样网站建设
  • 重庆seo网站哪家好招聘网站续费怎么做分录
  • 山东网站排名优化公司注册劳务公司需要多少钱
  • 城市分类信息网站系统c语言和网站建设的关系
  • 济南网站设计公司富家居网站建设策划
  • 做网站图片要求高吗企业网络品牌维护
  • 做新零售这些注册网站和找货源网站开发用什么技术可行性
  • 沈阳公司做网站制作一款软件需要多少钱
  • 我做服装设计师的 求推荐资源网站seochinaz查询
  • 湘潭做网站 m磐石网络高仿酒网站怎么做
  • 青岛市城市建设管理局网站seo网站推广招聘
  • 外贸英语网站中山做app网站公司哪家好
  • 建立网站怎么申请wordpress企业主题 下载
  • 视频网站的服务器多大关键词排名网站
  • 酒店网站建设公司排名网站建设 英语