收藏此站 联系我们 网站
当前位置:首页» 网络推广 » 【建站服务】象山企业网站设计 - 象山高端网站定制 - 象山品牌网站搭建 - 上往建站-域名申请

【建站服务】象山企业网站设计 - 象山高端网站定制 - 象山品牌网站搭建 - 上往建站-域名申请

作者: 风兰 . 阅读量: 8 . 发表时间:2022-09-21 05:53:15

网站建设

上往建站提供服务器空间服务商百度快照排名网站托管百度推广运营,致力于设计外包服务与源代码定制开发360推广搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。


象山企业网站设计 - 象山高端网站定制 - 象山品牌网站搭建 - 上往建站


网站建设.png

  1. 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

       funquiz

      fun***z@163.com

       参考地址

    4年前 (2018-12-28)
  2.    qianyang

      qia***ng.wang@gmail.com

    115

    我们单独写一个 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")}

    输出结果:

    hello 100world 150hello 200hello 300world 300hello 400world 450hello 500[Done] exited with code=0 in 2.066 seconds

    问题来了,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,则主函数会一直等待信道中的值,一旦信道有值,主函数才会结束


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(各城市商务人员可上门服务)


关键词:网站建设,企业网站,网站制作,网页设计,高端网站建设,企业网站制作,网页制作,制作网站,网站设计,高端网页设计,高端网站设计,做网站,自适应网站

全国服务热线
18114747181
二维码
手机端二维码
上往建站
地址:全国各地都有驻点商务 |  网站建设上往建站
在线咨询QQ:1120768800
 
QQ在线咨询
售前咨询热线
18114747181
营销顾问
营销顾问
售后服务热线
400-000-1116
售后服务
售后服务