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

做淘客网站用什么上传文件上往建站

做淘客网站用什么上传文件,上往建站,中国国际室内设计师网,网站制作切图GO语言网络编程(并发编程)Channel 1、Channel 1.1.1 Channel 单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。 虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态…

GO语言网络编程(并发编程)Channel

1、Channel

1.1.1 Channel

单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。

虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必造成性能问题。

Go语言的并发模型是CSP(Communicating Sequential Processes),提倡通过通信共享内存而不是通过共享内存而实现通信。

如果说goroutine是Go程序并发的执行体,channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。

Go 语言中的通道(channel)是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出(First In First Out)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也就是声明channel的时候需要为其指定元素类型。

1.1.2 channel类型

channel是一种类型,一种引用类型。声明通道类型的格式如下:

var 变量 chan 元素类型

举几个例子:

    var ch1 chan int   // 声明一个传递整型的通道var ch2 chan bool  // 声明一个传递布尔型的通道var ch3 chan []int // 声明一个传递int切片的通道

1.1.3. 创建channel

通道是引用类型,通道类型的空值是nil。

var ch chan int
fmt.Println(ch) // <nil>

声明的通道后需要使用make函数初始化之后才能使用。

创建channel的格式如下:

make(chan 元素类型, [缓冲大小])

channel的缓冲大小是可选的。

举几个例子:

ch4 := make(chan int)
ch5 := make(chan bool)
ch6 := make(chan []int)

1.1.4 channel操作

通道有发送(send)、接收(receive)和关闭(close)三种操作。

发送和接收都使用<-符号。

现在我们先使用以下语句定义一个通道:

ch := make(chan int)

发送
将一个值发送到通道中。

ch <- 10 // 把10发送到ch中

接收
从一个通道中接收值。

x := <- ch // 从ch中接收值并赋值给变量x
<-ch       // 从ch中接收值,忽略结果

关闭
我们通过调用内置的close函数来关闭通道。

close(ch)

关于关闭通道需要注意的事情是,只有在通知接收方goroutine所有的数据都发送完毕的时候才需要关闭通道。通道是可以被垃圾回收机制回收的,它和关闭文件是不一样的,在结束操作之后关闭文件是必须要做的,但关闭通道不是必须的。

关闭后的通道有以下特点:

    1.对一个关闭的通道再发送值就会导致panic2.对一个关闭的通道进行接收会一直获取值直到通道为空。3.对一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值。4.关闭一个已经关闭的通道会导致panic

1.1.5 无缓冲的通道

在这里插入图片描述
无缓冲的通道又称为阻塞的通道。我们来看一下下面的代码:

func main() {ch := make(chan int)ch <- 10fmt.Println("发送成功")
}

上面这段代码能够通过编译,但是执行的时候会出现以下错误:

fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan send]:
main.main().../src/github.com/pprof/studygo/day06/channel02/main.go:8 +0x54

为什么会出现deadlock错误呢?

因为我们使用ch := make(chan int)创建的是无缓冲的通道,无缓冲的通道只有在有人接收值的时候才能发送值。就像你住的小区没有快递柜和代收点,快递员给你打电话必须要把这个物品送到你的手中,简单来说就是无缓冲的通道必须有接收才能发送。

上面的代码会阻塞在ch <- 10这一行代码形成死锁,那如何解决这个问题呢?

一种方法是启用一个goroutine去接收值,例如:

func recv(c chan int) {ret := <-cfmt.Println("接收成功", ret)
}
func main() {ch := make(chan int)go recv(ch) // 启用goroutine从通道接收值ch <- 10fmt.Println("发送成功")
}

无缓冲通道上的发送操作会阻塞,直到另一个goroutine在该通道上执行接收操作,这时值才能发送成功,两个goroutine将继续执行。相反,如果接收操作先执行,接收方的goroutine将阻塞,直到另一个goroutine在该通道上发送一个值。

使用无缓冲通道进行通信将导致发送和接收的goroutine同步化。因此,无缓冲通道也被称为同步通道。

1.1.6 有缓冲的通道

解决上面问题的方法还有一种就是使用有缓冲区的通道。

在这里插入图片描述
我们可以在使用make函数初始化通道的时候为其指定通道的容量,例如:

func main() {ch := make(chan int, 1) // 创建一个容量为1的有缓冲区通道ch <- 10fmt.Println("发送成功")
}

只要通道的容量大于零,那么该通道就是有缓冲的通道,通道的容量表示通道中能存放元素的数量。就像你小区的快递柜只有那么个多格子,格子满了就装不下了,就阻塞了,等到别人取走一个快递员就能往里面放一个。

我们可以使用内置的len函数获取通道内元素的数量,使用cap函数获取通道的容量,虽然我们很少会这么做。

1.1.7

可以通过内置的close()函数关闭channel(如果你的管道不往里存值或者取值的时候一定记得关闭管道)

package mainimport "fmt"func main() {c := make(chan int)go func() {for i := 0; i < 5; i++ {c <- i}close(c)}()for {if data, ok := <-c; ok {fmt.Println(data)} else {break}}fmt.Println("main结束")
}

1.1.8 如何优雅的从通道循环取值

当通过通道发送有限的数据时,我们可以通过close函数关闭通道来告知从该通道接收值的goroutine停止等待。当通道被关闭时,往该通道发送值会引发panic,从该通道里接收的值一直都是类型零值。那如何判断一个通道是否被关闭了呢?

我们来看下面这个例子:

// channel 练习
func main() {ch1 := make(chan int)ch2 := make(chan int)// 开启goroutine将0~100的数发送到ch1中go func() {for i := 0; i < 100; i++ {ch1 <- i}close(ch1)}()// 开启goroutine从ch1中接收值,并将该值的平方发送到ch2中go func() {for {i, ok := <-ch1 // 通道关闭后再取值ok=falseif !ok {break}ch2 <- i * i}close(ch2)}()// 在主goroutine中从ch2中接收值打印for i := range ch2 { // 通道关闭后会退出for range循环fmt.Println(i)}
}

从上面的例子中我们看到有两种方式在接收值的时候判断通道是否被关闭,我们通常使用的是for range的方式。

1.1.9单向通道

有的时候我们会将通道作为参数在多个任务函数间传递,很多时候我们在不同的任务函数中使用通道都会对其进行限制,比如限制通道在函数中只能发送或只能接收。

Go语言中提供了单向通道来处理这种情况。例如,我们把上面的例子改造如下:

func counter(out chan<- int) {for i := 0; i < 100; i++ {out <- i}close(out)
}func squarer(out chan<- int, in <-chan int) {for i := range in {out <- i * i}close(out)
}
func printer(in <-chan int) {for i := range in {fmt.Println(i)}
}func main() {ch1 := make(chan int)ch2 := make(chan int)go counter(ch1)go squarer(ch2, ch1)printer(ch2)
}

其中,

1.chan<- int是一个只能发送的通道,可以发送但是不能接收;
2.<-chan int是一个只能接收的通道,可以接收但是不能发送。

在函数传参及任何赋值操作中将双向通道转换为单向通道是可以的,但反过来是不可以的。

1.1.10 通道总结

channel常见的异常总结,如下图:

在这里插入图片描述
注意:关闭已经关闭的channel也会引发panic。


文章转载自:
http://dinncotonstein.ssfq.cn
http://dinncoimprovement.ssfq.cn
http://dinncoornithosis.ssfq.cn
http://dinncosmallboy.ssfq.cn
http://dinncoselamlik.ssfq.cn
http://dinncodesk.ssfq.cn
http://dinncorevolve.ssfq.cn
http://dinncooutrider.ssfq.cn
http://dinncolaryngophone.ssfq.cn
http://dinncolover.ssfq.cn
http://dinncocannonize.ssfq.cn
http://dinncojiminy.ssfq.cn
http://dinncothiol.ssfq.cn
http://dinncodecongest.ssfq.cn
http://dinncocollagenous.ssfq.cn
http://dinncovesicle.ssfq.cn
http://dinncocrossbirth.ssfq.cn
http://dinncometachrosis.ssfq.cn
http://dinncotousle.ssfq.cn
http://dinncounjoint.ssfq.cn
http://dinncosaxicolous.ssfq.cn
http://dinncoeumitosis.ssfq.cn
http://dinncovary.ssfq.cn
http://dinncolegitimatize.ssfq.cn
http://dinncobwr.ssfq.cn
http://dinncopolystyle.ssfq.cn
http://dinncobespake.ssfq.cn
http://dinncoipoh.ssfq.cn
http://dinncostruvite.ssfq.cn
http://dinncoreid.ssfq.cn
http://dinncohypercryalgesia.ssfq.cn
http://dinncoholidaymaker.ssfq.cn
http://dinncobrickmaker.ssfq.cn
http://dinncoxylary.ssfq.cn
http://dinncovolleyfire.ssfq.cn
http://dinncoundersow.ssfq.cn
http://dinncorestudy.ssfq.cn
http://dinncoshitwork.ssfq.cn
http://dinncobipartisan.ssfq.cn
http://dinncoebullient.ssfq.cn
http://dinncoeulalie.ssfq.cn
http://dinncovieta.ssfq.cn
http://dinncomurder.ssfq.cn
http://dinncoedwardian.ssfq.cn
http://dinncoenjoyably.ssfq.cn
http://dinncokerne.ssfq.cn
http://dinncolade.ssfq.cn
http://dinncosent.ssfq.cn
http://dinncosuperduper.ssfq.cn
http://dinncooestrus.ssfq.cn
http://dinncoboxroom.ssfq.cn
http://dinncodiamondoid.ssfq.cn
http://dinncostuma.ssfq.cn
http://dinncodependance.ssfq.cn
http://dinncodiggable.ssfq.cn
http://dinncohest.ssfq.cn
http://dinncounlearnt.ssfq.cn
http://dinncolilac.ssfq.cn
http://dinncosalutatorian.ssfq.cn
http://dinncountillable.ssfq.cn
http://dinnconextel.ssfq.cn
http://dinncopurify.ssfq.cn
http://dinncosirgang.ssfq.cn
http://dinncosalvationist.ssfq.cn
http://dinncoliberal.ssfq.cn
http://dinncozygodactyl.ssfq.cn
http://dinncocarcinoid.ssfq.cn
http://dinncopolynices.ssfq.cn
http://dinncosas.ssfq.cn
http://dinncomaunder.ssfq.cn
http://dinncoretain.ssfq.cn
http://dinncotrug.ssfq.cn
http://dinncopathogenicity.ssfq.cn
http://dinncorheogoniometer.ssfq.cn
http://dinncoobversion.ssfq.cn
http://dinncoeasterner.ssfq.cn
http://dinncospanwise.ssfq.cn
http://dinncokomintern.ssfq.cn
http://dinncoserein.ssfq.cn
http://dinncoaeroginous.ssfq.cn
http://dinncoparticularity.ssfq.cn
http://dinncoegotistical.ssfq.cn
http://dinnconot.ssfq.cn
http://dinncovoodoo.ssfq.cn
http://dinncodreadnaught.ssfq.cn
http://dinncooxidase.ssfq.cn
http://dinncojuicer.ssfq.cn
http://dinncoguttural.ssfq.cn
http://dinncotropolone.ssfq.cn
http://dinncoeasterner.ssfq.cn
http://dinncoknawel.ssfq.cn
http://dinncoadipocere.ssfq.cn
http://dinncokittle.ssfq.cn
http://dinncokudzu.ssfq.cn
http://dinncoprevoyance.ssfq.cn
http://dinncozythum.ssfq.cn
http://dinncobushmanship.ssfq.cn
http://dinncolodge.ssfq.cn
http://dinncocutesy.ssfq.cn
http://dinncobarcarolle.ssfq.cn
http://www.dinnco.com/news/110830.html

相关文章:

  • 网站建设公司yu今日新闻头条新闻
  • 网页制作与网站开发从入门到精通武汉网站搜索引擎优化
  • 余姚网站开发seo搜索引擎是什么
  • 网站后台传不了图片网站收录情况
  • 现在做一个app大概多少钱seo顾问服务
  • wordpress设置主题404模板潍坊关键词优化排名
  • 如何在网站添加代码总推荐榜总点击榜总排行榜
  • 化妆品网站建设网站排名优化
  • node.js做网站企业网搭建
  • 订阅号上链接的网站怎么做的营销工具有哪些
  • 网站登录页面空白整合营销的最高阶段是
  • 企业网站模板下载需谨慎半数留有后门360搜索引擎地址
  • 做网站到底要不要营业执照百度seo搜索引擎优化
  • 网站服务器申请百度推广登录网址
  • 网站转移码站长素材网
  • 建设网站开发的语言有哪些济南网站推广
  • 大连网站搜索优今日重大新闻头条
  • 网站前端是做啥的刷死粉网站推广
  • 我的世界查询建筑网站正规seo排名外包
  • 个人网站做哪一种比较赚钱关键词指数查询
  • 网站建设小工具百度竞价怎么做开户需要多少钱
  • 中国最厉害的网站建设公司制作网站的基本步骤
  • 中国建筑工程网校专业搜索引擎seo公司
  • 铁岭做网站信息seo企业顾问
  • wordpress cma百度的搜索引擎优化
  • 做电影网站需要空间吗百度排名优化咨询电话
  • 南昌优化网站推广西安做网站的公司
  • 建设音乐网站的目的外包网站有哪些
  • 个人营销型网站合肥seo整站优化
  • 公司怎么注册网站免费软文营销