【建站服务】象山企业网站设计 - 象山高端网站定制 - 象山品牌网站搭建 - 上往建站-域名申请
作者: 风兰 . 阅读量: 8 . 发表时间:2022-09-21 05:53:15
上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。
象山企业网站设计 - 象山高端网站定制 - 象山品牌网站搭建 - 上往建站

ackage main
import (
"fmt"
"time"
)
func main() {
c := make(chan int, 10)
go fibonacci(cap(c), c)
for v := range c {
fmt.Println("out:", time.Now())
fmt.Println(v)
}
}
func fibonacci(n int, c chan int) {
x, y := 0, 1
for i :=0; i < n; i++ {
c <- x
fmt.Println("in:",time.Now())
time.Sleep(100)
x, y = y, x+y
}
close(c)
}
ghppph
ghppph
158***02109@163.com
4年前 (2019-02-13)
杨毅
yan***tl@163.com
52
关闭通道并不会丢失里面的数据,只是让读取通道数据的时候不会读完之后一直阻塞等待新数据写入
杨毅
杨毅
yan***tl@163.com
3年前 (2019-04-27)
Azz
azz***cret.com
52
Channel 是可以控制读写权限的 具体如下:
go func(c chan int) { //读写均可的channel c } (a)
go func(c <- chan int) { //只读的Channel } (a)
go func(c chan <- int) { //只写的Channel } (a)
Azz
Azz
azz***cret.com
3年前 (2019-04-28)
gibson1112
185***72536@163.com
54
形象说明一下无缓冲和有缓冲的区别:
无缓冲是同步的,例如 make(chan int),就是一个送信人去你家门口送信,你不在家他不走,你一定要接下信,他才会走,无缓冲保证信能到你手上。
有缓冲是异步的,例如 make(chan int, 1),就是一个送信人去你家仍到你家的信箱,转身就走,除非你的信箱满了,他必须等信箱空下来,有缓冲的保证信能进你家的邮箱。
修改一下上面笔记中的程序如下:
package main
import (
"fmt"
"time"
)
func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
fmt.Printf("sum:")
fmt.Printf("%#v ", sum)
c <- sum // 把 sum 发送到通道 c
fmt.Println("after channel pro")
}
// 通道不带缓冲,表示是同步的,只能向通道 c 发送一个数据,只要这个数据没被接收然后所有的发送就被阻塞
func main() {
s := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
fmt.Println("go [0,3]")
go sum(s[:len(s)/2], c) //a
//这里开启一个新的运行期线程,这个是需要时间的,本程序继续往下走
fmt.Println("go [3,6]")
go sum(s[len(s)/2:], c) //b
fmt.Println("go2 [0,3]")
go sum(s[:len(s)/2], c) //c
fmt.Println("go2 [3,6]")
go sum(s[len(s)/2:], c) //d
/*
a b c d和main一起争夺cpu的,他们的执行顺序完全无序,甚至里面不同的语句都相互穿插
但无缓冲的等待是同步的,所以
象山企业网站设计 - 象山高端网站定制 - 象山品牌网站搭建 - 上往建站
上往建站提供搭建网站,域名注册,官网备案服务,网店详情页设计,企业网店,专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管,网页美工排版,致力于域名申请,竞价托管,软文推广,全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机,网站推广,百度竞价托管,网站建设,上网建站推广服务,网络公司有哪些等业务,专业团队服务,效果好。
服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)
关键词:网站建设,企业网站,网站制作,网页设计,高端网站建设,企业网站制作,网页制作,制作网站,网站设计,高端网页设计,高端网站设计,做网站,自适应网站



goroutine 是 golang 中在语言级别实现的轻量级线程,仅仅利用 go 就能立刻起一个新线程。多线程会引入线程之间的同步问题,在 golang 中可以使用 channel 作为同步的工具。
通过 channel 可以实现两个 goroutine 之间的通信。
创建一个 channel, make(chan TYPE {, NUM}) TYPE 指的是 channel 中传输的数据类型,第二个参数是可选的,指的是 channel 的容量大小。
向 channel 传入数据, CHAN <- DATA , CHAN 指的是目的 channel 即收集数据的一方, DATA 则是要传的数据。
从 channel 读取数据, DATA := <-CHAN ,和向 channel 传入数据相反,在数据输送箭头的右侧的是 channel,形象地展现了数据从隧道流出到变量里。
funquiz
fun***z@163.com
参考地址
qianyang
qia***ng.wang@gmail.com
我们单独写一个 say2 函数来跑 goroutine,并且 Sleep 时间设置长一点,150 毫秒,看看会发生什么:
package mainimport ( "fmt" "time")func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s, (i+1)*100) }}func say2(s string) { for i := 0; i < 5; i++ { time.Sleep(150 * time.Millisecond) fmt.Println(s, (i+1)*150) }}func main() { go say2("world") say("hello")}输出结果:
问题来了,say2 只执行了 3 次,而不是设想的 5 次,为什么呢?
原来,在 goroutine 还没来得及跑完 5 次的时候,主函数已经退出了。
我们要想办法阻止主函数的结束,要等待 goroutine 执行完成之后,再退出主函数:
package mainimport ( "fmt" "time")func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s, (i+1)*100) }}func say2(s string, ch chan int) { for i := 0; i < 5; i++ { time.Sleep(150 * time.Millisecond) fmt.Println(s, (i+1)*150) } ch <- 0 close(ch)}func main() { ch := make(chan int) go say2("world", ch) say("hello") fmt.Println(<-ch)}我们引入一个信道,默认的,信道的存消息和取消息都是阻塞的,在 goroutine 中执行完成后给信道一个值 0,则主函数会一直等待信道中的值,一旦信道有值,主函数才会结束