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

网站建设流程有如何搭建asp网站

网站建设流程有,如何搭建asp网站,网站用什么系统,乐清网站优化推广包含了go学习笔记,含有channel的基础学习,编写数字的平方,如何成组的合并channel,如何优雅的关闭退出并发协程,通道阻塞情况分析,channel与哪些变成情况,可谓是收藏好文. 文章目录 并发1:chann…

包含了go学习笔记,含有channel的基础学习,编写数字的平方,如何成组的合并channel,如何优雅的关闭退出并发协程,通道阻塞情况分析,channel与哪些变成情况,可谓是收藏好文.

文章目录

  • 并发1:channel的基础学习
  • 并发2:编写数字的平方
  • 并发3:组装式编写数字的平方
  • 并发4:如何关闭退出并发协程
  • 并发5:通道阻塞情况
  • 并发5:channel情况汇总

并发1:channel的基础学习

func main() {ch := make(chan int, 2)ch <- 1ch <- 2elem, ok := <-chif ok != true {fmt.Println("channel closed")}fmt.Println(elem)
}

一个从channel里读,一个从channel里写

func main() {syncChan1 := make(chan struct{}, 1)syncChan2 := make(chan struct{}, 2)go func() {<-syncChan1fmt.Println("receive a sync signal and wait a second...[receiver]")time.Sleep(time.Second)for {if elem, ok := <-strChan; ok {fmt.Println("Received:", elem, "[receiver]")} else {break}}fmt.Println("stopped [receiver]")syncChan2 <- struct{}{}}()go func() {for _, elem := range []string{"a", "b", "c", "d"} {strChan <- elemfmt.Println("sent:", elem, "[sender]")if elem == "c" {syncChan1 <- struct{}{} //唤醒接收的go携程,fmt.Println("sent a sync signal:", elem, "[sender]")}}fmt.Println("ait 2 seconds...[sender]")time.Sleep(time.Second * 2)close(strChan)syncChan2 <- struct{}{}}()<-syncChan2<-syncChan2
}

赋值写入

type Counter struct {count int
}var mapChan2 = make(chan map[string]*Counter, 1)func (counter *Counter) String() string {return fmt.Sprintf("counter:%d", counter.count)
}
func main() {syncChan := make(chan struct{}, 2)go func() {for {if elem, ok := <-mapChan2; ok {counter := elem["count"]counter.count++} else {break}}fmt.Println("stopped [receiver]")syncChan <- struct{}{}}()go func() {countMap := map[string]*Counter{"count": &Counter{},}for i := 0; i < 5; i++ {mapChan2 <- countMaptime.Sleep(time.Millisecond)fmt.Printf("The count map::%v [sender]\n", countMap)}close(mapChan2)syncChan <- struct{}{}}()<-syncChan<-syncChan
}

用struct进行通信

func main() {dataChan := make(chan int, 5)syncChan1 := make(chan struct{}, 1)syncChan2 := make(chan struct{}, 2)go func() {<-syncChan1for {if elem, ok := <-dataChan; ok {fmt.Printf("Received:%d [receiver]\n]", elem)} else {break}}fmt.Println("Done [receiver]")syncChan2 <- struct{}{}}()go func() {for i := 0; i < 5; i++ {dataChan <- ifmt.Printf("Sent:%d [sender]\n", i)}close(dataChan)syncChan1 <- struct{}{}syncChan2 <- struct{}{}}()<-syncChan2<-syncChan2
}

用select case进行读取

func main() {chanCap := 5intChan := make(chan int, chanCap)for i := 0; i < chanCap; i++ {select {case intChan <- 1:case intChan <- 2:case intChan <- 3:}}for i := 0; i < chanCap; i++ {fmt.Println(<-intChan)}
}

并发2:编写数字的平方

func producer(nums ...int) <-chan int {out := make(chan int)go func() {defer close(out)for _, n := range nums {out <- n}}()return out
}func square(inCh <-chan int) <-chan int {out := make(chan int)go func() {defer close(out)for n := range inCh {out <- n * n}}()return out}func main() {in := producer(1, 2, 3, 4, 5, 6)out := square(in)for ret := range out {fmt.Println(ret)}fmt.Println("done")
}

并发3:组装式编写数字的平方

func producer(nums ...int) <-chan int {out := make(chan int)go func() {defer close(out)for _, n := range nums {out <- n}}()return out
}func square(inCh <-chan int) <-chan int {out := make(chan int)go func() {defer close(out)for n := range inCh {out <- n * n}}()return out}func merge(cs ...<-chan int) <-chan int {out := make(chan int)var wg sync.WaitGroupcollect := func(in <-chan int) {defer wg.Done()for n := range in {out <- n}}wg.Add(len(cs))for _, c := range cs {go collect(c)}go func() {wg.Wait()close(out)}()return out}
func main() {in := producer(1, 2, 3, 4, 5, 6)c1 := square(in)c2 := square(in)c3 := square(in)for ret := range merge(c1, c2, c3) {fmt.Printf("%3d ", ret)}fmt.Println("\ndone")
}

并发4:如何关闭退出并发协程

文章链接:退出

  • 使用for-range退出
  • 使用,ok退出
  • 使用退出通道退出

并发5:通道阻塞情况

// 场景1
// 通道中无数据,但执行读通道func ReadNoDataFromNoBufCh() {noBufCh := make(chan int)<-noBufCh //通道中没数据,你还读,必然阻塞fmt.Println("read from no buffer channel success")}//场景2
//通道中无数据,向通道中写数据,但无协程读取func WriteNoBufCh() {ch := make(chan int)ch <- 1 //通道中无数据,向通道写数据,但无协程读取fmt.Println("write to no buffer channel success")
}//场景3
//通道的缓存中无数据但执行读通道func ReaNoDataFromBufCh() {noBufCh := make(chan int, 1)<-noBufCh //通道中没数据,你还读,必然阻塞fmt.Println("ReaNoDataFromBufCh")}//场景4
//通道缓存已经占满,向通道写数据,但无协程读func WriteBufChButFull() {ch := make(chan int, 1)ch <- 1ch <- 2 //通道缓存已经占满,向通道写数据,但无协程读fmt.Println("WriteBufChButFull")
}

并发5:channel情况汇总

场景原理用法
需要不断从channel读取数据时该方法,当channel关闭时,for循环自动退出,可以防止读取已经关闭的channelfor x := range ch {}
v,ok := <- ch + select操作判断channel是否关闭ok为true,读到数据,ok为false,没读到数据v,ok := <- ch + select
需要对多个通道进行同时处理,但只处理最先发生的channel时select 可以同时监视多个通道的情况,只处理未阻塞的case,当通道为nil时,对应的case永远为阻塞,无论读写,特殊关注:普通情况下,对nil的通道写操作是要panic的select
如果协程只读或只写双向通道变成单向通道单向通道只能只读或只写
异步有缓冲通道可供多个协程同时处理,在一定程度可提高并发性make(chan int,10)
需要超时控制的操作使用selecttime.After,看操作和定时哪个先返回,处理先完成的,就达到了超时控制的效果case <- time.After()
并不希望在channel的读写上浪费时间是为操作加上超时的扩展,这里的操是channel的读或写case <-time.After()
退出时,显示通道所有协程退出所有读ch协程都会收到close(ch)的信号使用close(ch)关闭所有下游协程
使用channel传递信号,而不是传递数据时没数据需要传递时,传递空struct使用chan struct{} 作为信号channel
使用channel传递结构体数据时channel本质上传递的是数据的拷贝,拷贝的数据越小传输效率越高,传递结构体指针,比传递结构体更高效使用channel传递结构体的指针而非结构体
用来获取结果channel可以用来传递变量,channel自身也是变量,可以传递自己使用channel传递channel

文章转载自:

http://ZiQy28yp.fgkwh.cn
http://EkLWMUny.fgkwh.cn
http://GK5P8g59.fgkwh.cn
http://iD4Mm2ME.fgkwh.cn
http://JPpy2Ylh.fgkwh.cn
http://Sn8qQQKO.fgkwh.cn
http://m3irVUbK.fgkwh.cn
http://kfJXTPV3.fgkwh.cn
http://NSB6WKS8.fgkwh.cn
http://mU41TkjW.fgkwh.cn
http://MUNYhRna.fgkwh.cn
http://4cZtKT2m.fgkwh.cn
http://q2qYgI0U.fgkwh.cn
http://eS9ABXL3.fgkwh.cn
http://qZyIvwxv.fgkwh.cn
http://STNOYeuT.fgkwh.cn
http://kzb9PMTr.fgkwh.cn
http://YBkispaM.fgkwh.cn
http://nSGzSNYG.fgkwh.cn
http://hMhaW3C5.fgkwh.cn
http://5tSCXZZK.fgkwh.cn
http://gPboT2Tt.fgkwh.cn
http://oHPWf6yH.fgkwh.cn
http://IcMf1MSC.fgkwh.cn
http://I1hxBuWk.fgkwh.cn
http://LR5ac0yb.fgkwh.cn
http://FzseTMIY.fgkwh.cn
http://KYAsa1fS.fgkwh.cn
http://La2Ps4E9.fgkwh.cn
http://Q7vulaAN.fgkwh.cn
http://www.dtcms.com/wzjs/632606.html

相关文章:

  • 青岛做网站企业排名如何做网站的推广
  • 企业网站建设实训总结做网站的公司违约怎么处理
  • 网站页面打开速度无为县住房建设局网站
  • 如何建立网站是什么青岛网站搜索排名
  • 郑州的电子商城网站建设博客类网站源码
  • 有个专门做简历的网站叫网站建设知识学习心得
  • w3c网站开发影视公司联系方式
  • 关于服装的网站规划与设计垂直类网站怎么做推广
  • 做自己的网站vps搭建网站
  • 改成 响应式 网站关于室内设计的网站有哪些
  • 做试用网站的原理在线设计平台哪个好用
  • 做任务的正规网站网页微信怎么换行
  • 深圳正规制作网站让别人做网站需要注意什么
  • 徐州手机网站制作公司哪家好南宁东凯做网站的公司
  • 南宁市建设局网站html5网站素材
  • 自开发网站网页设计网站制作流程
  • 淘宝上的网站建设可信开源企业建站系统php
  • 百润网站建设泰安爆炸最新消息今天
  • 苏州企业网站开发wordpress分级标题
  • 免费网站建设平台 iis产品项目开发流程图
  • 响应式网站和传统网站网络推手公司怎么收费
  • c net做的网站化工行业网站
  • 网站建设实践百度收录域名
  • 大企业网站建设方案社保在哪个网站做增员
  • 微信营销网站(含html源文件)免费下载学校网站群建设思路
  • 做的网站需要什么技术宠物食品 中企动力提供网站建设
  • 网站建设的基本特点如何做企业第一管理人
  • 重庆的网站建设绍兴网站制作推广
  • discuz品牌空间网站电商软件什么品牌好
  • 天津免费建设网站广告设计专业分析