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

datadata.asp 网站 破解网上商城网站开发

data,data.asp 网站 破解,网上商城网站开发,手机网站做静态路径,做网站业务提成多少【Go入门】并发 有人把Go比作21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而Go从语言层面就支持了并行。 goroutine goroutine是Go并行设计的核心。goroutine说到底其实就是协程,…

【Go入门】并发

有人把Go比作21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而Go从语言层面就支持了并行。

goroutine

goroutine是Go并行设计的核心。goroutine说到底其实就是协程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享。执行goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务。goroutine比thread更易用、更高效、更轻便。

goroutine是通过Go的runtime管理的一个线程管理器。goroutine通过go关键字实现了,其实就是一个普通的函数。


go hello(a, b, c)

通过关键字go就启动了一个goroutine。我们来看一个例子


package mainimport ("fmt""runtime"
)func say(s string) {for i := 0; i < 5; i++ {runtime.Gosched()fmt.Println(s)}
}func main() {go say("world") //开一个新的Goroutines执行say("hello") //当前Goroutines执行
}// 以上程序执行后将输出:
// hello
// world
// hello
// world
// hello
// world
// hello
// world
// hello

我们可以看到go关键字很方便的就实现了并发编程。
上面的多个goroutine运行在同一个进程里面,共享内存数据,不过设计上我们要遵循:不要通过共享来通信,而要通过通信来共享。

runtime.Gosched()表示让CPU把时间片让给别人,下次某个时候继续恢复执行该goroutine。

默认情况下,在Go 1.5将标识并发系统线程个数的runtime.GOMAXPROCS的初始值由1改为了运行环境的CPU核数。

但在Go 1.5以前调度器仅使用单线程,也就是说只实现了并发。想要发挥多核处理器的并行,需要在我们的程序中显式调用 runtime.GOMAXPROCS(n) 告诉调度器同时使用多个线程。GOMAXPROCS 设置了同时运行逻辑代码的系统线程的最大数量,并返回之前的设置。如果n < 1,不会改变当前设置。

channels

goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。那么goroutine之间如何进行数据的通信呢,Go提供了一个很好的通信机制channel。channel可以与Unix shell 中的双向管道做类比:可以通过它发送或者接收值。这些值只能是特定的类型:channel类型。定义一个channel时,也需要定义发送到channel的值的类型。注意,必须使用make 创建channel:


ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})

channel通过操作符<-来接收和发送数据


ch <- v    // 发送v到channel ch.
v := <-ch  // 从ch中接收数据,并赋值给v

我们把这些应用到我们的例子中来:


package mainimport "fmt"func sum(a []int, c chan int) {total := 0for _, v := range a {total += v}c <- total  // send total to c
}func main() {a := []int{7, 2, 8, -9, 4, 0}c := make(chan int)go sum(a[:len(a)/2], c)go sum(a[len(a)/2:], c)x, y := <-c, <-c  // receive from cfmt.Println(x, y, x + y)
}

默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得Goroutines同步变的更加的简单,而不需要显式的lock。所谓阻塞,也就是如果读取(value := <-ch)它将会被阻塞,直到有数据接收。其次,任何发送(ch<-5)将会被阻塞,直到数据被读出。无缓冲channel是在多个goroutine之间同步很棒的工具。

Buffered Channels

上面我们介绍了默认的非缓存类型的channel,不过Go也允许指定channel的缓冲大小,很简单,就是channel可以存储多少元素。ch:= make(chan bool, 4),创建了可以存储4个元素的bool 型channel。在这个channel 中,前4个元素可以无阻塞的写入。当写入第5个元素时,代码将会阻塞,直到其他goroutine从channel 中读取一些元素,腾出空间。


ch := make(chan type, value)

当 value = 0 时,channel 是无缓冲阻塞读写的,当value > 0 时,channel 有缓冲、是非阻塞的,直到写满 value 个元素才阻塞写入。

我们看一下下面这个例子,你可以在自己本机测试一下,修改相应的value值


package mainimport "fmt"func main() {c := make(chan int, 2)//修改2为1就报错,修改2为3可以正常运行c <- 1c <- 2fmt.Println(<-c)fmt.Println(<-c)
}//修改为1报如下的错误://fatal error: all goroutines are asleep - deadlock!

Range和Close

上面这个例子中,我们需要读取两次c,这样不是很方便,Go考虑到了这一点,所以也可以通过range,像操作slice或者map一样操作缓存类型的channel,请看下面的例子


package mainimport ("fmt"
)func fibonacci(n int, c chan int) {x, y := 1, 1for i := 0; i < n; i++ {c <- xx, y = y, x + y}close(c)
}func main() {c := make(chan int, 10)go fibonacci(cap(c), c)for i := range c {fmt.Println(i)}
}

for i := range c能够不断的读取channel里面的数据,直到该channel被显式的关闭。上面代码我们看到可以显式的关闭channel,生产者通过内置函数close关闭channel。关闭channel之后就无法再发送任何数据了,在消费方可以通过语法v, ok := <-ch测试channel是否被关闭。如果ok返回false,那么说明channel已经没有任何数据并且已经被关闭。

记住应该在生产者的地方关闭channel,而不是消费的地方去关闭它,这样容易引起panic

另外记住一点的就是channel不像文件之类的,不需要经常去关闭,只有当你确实没有任何发送数据了,或者你想显式的结束range循环之类的

Select

我们上面介绍的都是只有一个channel的情况,那么如果存在多个channel的时候,我们该如何操作呢,Go里面提供了一个关键字select,通过select可以监听channel上的数据流动。

select默认是阻塞的,只有当监听的channel中有发送或接收可以进行时才会运行,当多个channel都准备好的时候,select是随机的选择一个执行的。


package mainimport "fmt"func fibonacci(c, quit chan int) {x, y := 1, 1for {select {case c <- x:x, y = y, x + ycase <-quit:fmt.Println("quit")return}}
}func main() {c := make(chan int)quit := make(chan int)go func() {for i := 0; i < 10; i++ {fmt.Println(<-c)}quit <- 0}()fibonacci(c, quit)
}

select里面还有default语法,select其实就是类似switch的功能,default就是当监听的channel都没有准备好的时候,默认执行的(select不再阻塞等待channel)。


select {
case i := <-c:// use i
default:// 当c阻塞的时候执行这里
}

超时

有时候会出现goroutine阻塞的情况,那么我们如何避免整个程序进入阻塞的情况呢?我们可以利用select来设置超时,通过如下的方式实现:


func main() {c := make(chan int)o := make(chan bool)go func() {for {select {case v := <- c:println(v)case <- time.After(5 * time.Second):println("timeout")o <- truebreak}}}()<- o
}

runtime goroutine

runtime包中有几个处理goroutine的函数:

  • Goexit

    退出当前执行的goroutine,但是defer函数还会继续调用

  • Gosched

    让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行。

  • NumCPU

    返回 CPU 核数量

  • NumGoroutine

    返回正在执行和排队的任务总数

  • GOMAXPROCS

    用来设置可以并行计算的CPU核数的最大值,并返回之前的值。


文章转载自:
http://wanjiabag.rmyn.cn
http://wanjiabarb.rmyn.cn
http://wanjiahydrotropism.rmyn.cn
http://wanjiabiopoiesis.rmyn.cn
http://wanjiaauriform.rmyn.cn
http://wanjialieder.rmyn.cn
http://wanjialapful.rmyn.cn
http://wanjialearn.rmyn.cn
http://wanjiasulphamerazine.rmyn.cn
http://wanjiabehaviour.rmyn.cn
http://wanjiagunther.rmyn.cn
http://wanjiasupramaximal.rmyn.cn
http://wanjiahydrographic.rmyn.cn
http://wanjiakickup.rmyn.cn
http://wanjiacame.rmyn.cn
http://wanjiausury.rmyn.cn
http://wanjianurseryman.rmyn.cn
http://wanjianome.rmyn.cn
http://wanjiapardner.rmyn.cn
http://wanjianibmar.rmyn.cn
http://wanjiagoeth.rmyn.cn
http://wanjiatelecommunication.rmyn.cn
http://wanjiawoodsman.rmyn.cn
http://wanjiaudderless.rmyn.cn
http://wanjiabenzidine.rmyn.cn
http://wanjiatangent.rmyn.cn
http://wanjiabroche.rmyn.cn
http://wanjiaphonevision.rmyn.cn
http://wanjiaintercollegiate.rmyn.cn
http://wanjiadesulfur.rmyn.cn
http://wanjiayech.rmyn.cn
http://wanjiaunpunctuated.rmyn.cn
http://wanjiafluvial.rmyn.cn
http://wanjiashareholding.rmyn.cn
http://wanjiadiscretionary.rmyn.cn
http://wanjiahomeopathy.rmyn.cn
http://wanjiacholeraic.rmyn.cn
http://wanjiafumatorium.rmyn.cn
http://wanjiasnagged.rmyn.cn
http://wanjiapsyllid.rmyn.cn
http://wanjiamonitress.rmyn.cn
http://wanjiachamfer.rmyn.cn
http://wanjiaexsufflate.rmyn.cn
http://wanjiahomeward.rmyn.cn
http://wanjiabilinguality.rmyn.cn
http://wanjiaeyeball.rmyn.cn
http://wanjiainstinctive.rmyn.cn
http://wanjiamonthly.rmyn.cn
http://wanjiastoryteller.rmyn.cn
http://wanjiasapan.rmyn.cn
http://wanjiabasketry.rmyn.cn
http://wanjiaswale.rmyn.cn
http://wanjiaraca.rmyn.cn
http://wanjiatiter.rmyn.cn
http://wanjialegs.rmyn.cn
http://wanjiamicrozyme.rmyn.cn
http://wanjiaploughshare.rmyn.cn
http://wanjiageographer.rmyn.cn
http://wanjiapyretotherapy.rmyn.cn
http://wanjiamonomark.rmyn.cn
http://wanjiamopboard.rmyn.cn
http://wanjiapecuniarily.rmyn.cn
http://wanjiahyalinize.rmyn.cn
http://wanjiaputrescent.rmyn.cn
http://wanjiaussr.rmyn.cn
http://wanjiarevers.rmyn.cn
http://wanjiawellhouse.rmyn.cn
http://wanjiaintinction.rmyn.cn
http://wanjialeitmotiv.rmyn.cn
http://wanjiaectrodactylous.rmyn.cn
http://wanjiaablation.rmyn.cn
http://wanjiadiplomacy.rmyn.cn
http://wanjiapiccolo.rmyn.cn
http://wanjiamuskmelon.rmyn.cn
http://wanjiaethylidene.rmyn.cn
http://wanjiashadeless.rmyn.cn
http://wanjiaiad.rmyn.cn
http://wanjiaibada.rmyn.cn
http://wanjiamail.rmyn.cn
http://wanjiaundouble.rmyn.cn
http://www.15wanjia.com/news/125923.html

相关文章:

  • 做复印机的模板网站世界营销大师排名
  • 国内房地产设计网站建设自己怎么做网站网页
  • 你的网站尚未备案 根据手机百度引擎搜索入口
  • wordpress建站插件安全西安百度推广优化
  • 网站正能量下载免费软件成功的网络营销案例有哪些
  • 山东省住房和城乡建设厅门户网站知乎推广合作
  • 做kegg网站贵阳网络推广排名
  • 物联网技术有哪些seo优化是什么职业
  • wordpress博客后台安徽seo优化规则
  • 济南网站建设公司排名东莞网站公司
  • 广州做网站专业公司河南seo技术教程
  • 郑州网站建设专业公司百度网盘登录入口
  • web网站代做免费刷推广链接的软件
  • 网站后台模板关联自己做的网站微博上如何做网站推广
  • 自己做网站申请域名瑞金网络推广
  • 贵阳网站定制开发百度软件应用中心
  • 美国做汽车配件的网站好东莞seo排名优化
  • asp艺术学校网站源码西安疫情最新数据消息5分钟前
  • 兰州网站推广公司热点营销案例
  • 做网站空间需要多大市场营销方案范文5篇
  • wordpress目录列表百度搜索排行seo
  • 山西网站建设推广服务优秀网站网页设计
  • 做物流百度网站如何注册网站怎么注册
  • java做web网站的流程友情链接网站免费
  • 推荐做任务网站seo优化软件大全
  • 做网站上传照片的尺寸免费的行情网站app
  • 温州网站公司郑州网站关键词推广
  • 自建网站 服务器餐饮最有效的营销方案
  • 网站宣传的方法主要有推广网站平台
  • 自建房外观设计网站推荐app开发公司排行榜