go14--并发concurrency,Goroutine ,channel

package main

/**

并发concurrency

很多人都是冲着 Go 大肆宣扬的高并发而忍不住跃跃欲试,但其实从
源码的解析来看,goroutine 只是由官方实现的超级“线程池”而已。
不过话说回来,每个实例 4-5KB 的栈内存占用和由于实现机制而大幅
减少的创建和销毁开销,是制造 Go 号称的高并发的根本原因。另外,
goroutine 的简单易用,也在语言层面上给予了开发者巨大的便利。

并发不是并行:
并发切换时间片,单核是没有并行的,只有一个线程,在并行则是直接利用
多核实现多线程的运行,多核是并行,有多个线程,但 Go 可以设置使用核数,以发挥多核计算机
的能力。

高并发:因为创建销毁的很快,每一个占内存很小,
Goroutine 奉行通过通信来共享内存,而不是共享内存来通信。

*/
import (
    "fmt"
    "runtime"
    "time"
)

func main1() {
    go GO()                     //这就是一个Goroutine,运行了一个Goroutine,
    time.Sleep(2 * time.Second) //暂停2秒钟,不暂停是不会输出的GOGOGO的,
}

func GO() {
    fmt.Println("GOGOGO")
}

func main2() {
    c := make(chan bool) //创建一个channel
    go func() {          //go后面接一个匿名函数
        fmt.Println("GGGGGOOOOOO")
        c <- true //channel中存入true或false随便,
    }()
    <-c //从channel中取出来,go启动一个Goroutine之后main函数就执行到<-c并且阻塞了,因为他在等着从
    //channel中取出东西来,只有c <- true执行了,放入东西到channel了,main就可以取出东西来了,
    //通知main函数,他那里执行完毕了,main就继续执行完了
}

func main3() {
    c := make(chan bool)
    go func() {
        fmt.Println("GGGGGOOOOOO")
        c <- true //执行打印v,执行fmt.Println(v),
        close(c)  //关闭不再迭代,不关闭则一直打印死锁了
    }()
    for v := range c { //迭代channel的时候,一直在等待有值进去,才可以取出来,在打印出来,
        fmt.Println(v)
    }
    /*
        GGGGGOOOOOO
        true
    */
}

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU()) //返回当前cpu的核数,并利用多核操作Goroutine(Goroutine是线程池)
    c := make(chan bool)
    for i := 0; i < 10; i++ {
        go GO1(c, i) //启动9个goroutine
    }
    <-c //告诉main函数可以退出了
}

func GO1(c chan bool, index int) {
    a := 1

    for i := 0; i < 100000000; i++ {
        a += 1
    }
    fmt.Println(index, a)
    if index == 9 { //启动第九个goroutine的时候就可以告诉main函数可以退出了,
        //多核的时候index=9不一定是最后执行的,所以不一定会执行9遍,有可能执行一遍就退出了,解决方法:缓存的channel
        c <- true
    }
}
package main

import (
    "fmt"
    "runtime"
)

//缓存的channel
func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    c := make(chan bool, 10) //缓存的channel,缓存10个,
    for i := 0; i < 10; i++ {
        go GO1(c, i)
    }
    for i := 0; i < 10; i++ {
        <-c //取10次,就知道goroutine执行完了,这样就保证了能够打印10 次
    }
}

func GO1(c chan bool, index int) {
    a := 1

    for i := 0; i < 100000000; i++ {
        a += 1
    }
    fmt.Println(index, a) //,这样就保证了能够打印10 次
    c <- true             //存10次
}

/*
    9 100000001
    5 100000001
    0 100000001
    8 100000001
    7 100000001
    4 100000001
    1 100000001
    2 100000001
    6 100000001
    3 100000001
*/
package main

import (
    "fmt"
    "runtime"
    "sync" //有一个任务组,每完成一个任务就减一,等任务数为0的时候任务就完成了
)

//第二种解决方案:同步,通过同步包实现多个Goroutine 打印内容
func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    wg := sync.WaitGroup{} //创建一个任务组
    wg.Add(10)             //添加10个任务

    for i := 0; i < 10; i++ {
        go GO1(&wg, i) //添加10个Goroutine
    }

    wg.Wait() //等待
}

func GO1(wg *sync.WaitGroup, index int) {
    fmt.Println(index) //打印就是一次任务
    wg.Done()          //任务完成一次
}

/*
    0 9 1 2 3 4 5 6 7 8
*/
时间: 2024-10-24 19:52:42

go14--并发concurrency,Goroutine ,channel的相关文章

GO_11:GO语言基础之并发concurrency

并发Concurrency 很多人都是冲着 Go 大肆宣扬的高并发而忍不住跃跃欲试,但其实从源码的解析来看,goroutine 只是由官方实现的超级"线程池"而已.不过话说回来,每个实例 4-5KB的栈内存占用和由于实现机制而大幅减少的创建和销毁开销,是制造 Go 号称的高并发的根本原因.另外,goroutine 的简单易用,也在语言层面上给予了开发者巨大的遍历. 高并发当中一定要注意:并发可不是并行. 并发主要由切换时间片来实现"同时"运行,而并行则是直接利用多核

GO语言基础之并发concurrency

并发Concurrency 很多人都是冲着 Go 大肆宣扬的高并发而忍不住跃跃欲试,但其实从源码的解析来看,goroutine 只是由官方实现的超级"线程池"而已.不过话说回来,每个实例 4-5KB的栈内存占用和由于实现机制而大幅减少的创建和销毁开销,是制造 Go 号称的高并发的根本原因.另外,goroutine 的简单易用,也在语言层面上给予了开发者巨大的遍历. 高并发当中一定要注意:并发可不是并行. 并发主要由切换时间片来实现"同时"运行,而并行则是直接利用多核

使用goroutine+channel和java多线程+queue队列的方式开发各有什么优缺点?

我感觉很多项目使用java或者c的多线程库+线程安全的queue数据结构基本上可以实现goroutine+channel开发能达到的需求,所以请问一下为什么说golang更适合并发服务端的开发呢?使用goroutine+channel和java多线程+queue队列的方式开发各有什么优缺点? 使用goroutine+channel和java多线程+queue队列的方式开发各有什么优缺点? >> golang 这个答案描述的挺清楚的:http://www.goodpm.net/postreply

golang goroutine channel [fmt.Println=&gt;String]

初识golang,这部分也不是很了解,百度了一下,做个小记录 goroutine是golang用来做并发处理的,使用起来很简单  go func(){...}(),就是看起来随便用一般而容易go的滥用,所以使用时要仔细斟酌才好. channel 大约是用来在线程间传递数据的,主线程开通一个channel,goroutine往channel中存入内容 1.channel只能用make创建 c := make(chan int) 2.channel中存入数据 c<-2  //把2存入到channel

golang并发编程之channel

一.概念channel是golang语言级别提供的协程(goroutine)之间的通信方式.goroutine运行在相同的地址空间,因此访问共享内存必须做好同步.那么goroutine之间如何进行数据的通信呢,Go提供了一个很好的通信机制channel.channel可以与Unix shell 中的双向管道做类比:可以通过它发送或者接收值.这些值只能是特定的类型:channel类型.定义一个channel时,也需要定义发送到channel的值的类型. 二.声明方式 var chanName ch

goroutine/channel(select、定时器)

应用场景举例:一个任务管道满了,再往里面塞就塞不进去了,浏览器刷不出来了.用户即便关了浏览器可能依然在阻塞...... package main import "fmt" import "time" func main() { var ch chan int ch = make(chan int, 10) ch2 := make(chan int, 10) go func() { var i int for { ch <- i time.Sleep(time.

goroutine channel

原文地址:https://www.cnblogs.com/sunlong88/p/11203892.html

Golang后台开发初体验

转自:http://blog.csdn.net/cszhouwei/article/details/37740277 补充反馈 slice 既然聊到slice,就不得不提它的近亲array,这里不太想提值类型和引用类型的概念(个人觉得其实都是值类型),golang的array其实可以假想为C的struct类型,只是struct通过变量名来访问成员(如xxx.yyy),而array通过下标来访问成员(如xxx[3]),具体内存布局如下图所示: 图 1 golang的array内存布局 显然gola

Goroutine并发调度模型深度解析之手撸一个协程池

golanggoroutine协程池Groutine Pool高并发 并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题:Go语言作为一个出道以来就自带 『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go语言中的并发(并行)编程是经由goroutine实现的,goroutine是golang最重要的特性之一,具有使用成本低.消耗资源低.能效高等特点,官方宣称原生goroutine并发成千上万不成问题,于是它也成为Gopher们经常