package main

/**

并发concurrency

很多人都是冲着 Go 大肆宣扬的高并发而忍不住跃跃欲试,但其实从
源码的解析来看,goroutine 只是由官方实现的超级“线程池”而已。
不过话说回来,每个实例 4-5KB 的栈内存占用和由于实现机制而大幅
减少的创建和销毁开销,是制造 Go 号称的高并发的根本原因。另外,
goroutine 的简单易用,也在语言层面上给予了开发者巨大的便利。 并发不是并行:
并发切换时间片,单核是没有并行的,只有一个线程,在并行则是直接利用
多核实现多线程的运行,多核是并行,有多个线程,但 Go 可以设置使用核数,以发挥多核计算机
的能力。 高并发:因为创建销毁的很快,每一个占内存很小,
Goroutine 奉行通过通信来共享内存,而不是共享内存来通信。 */
import (
"fmt"
"runtime"
"time"
) func main1() {
go GO() //这就是一个Goroutine,运行了一个Goroutine,
time.Sleep( * 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 := ; i < ; i++ {
go GO1(c, i) //启动9个goroutine
}
<-c //告诉main函数可以退出了
} func GO1(c chan bool, index int) {
a := for i := ; i < ; i++ {
a +=
}
fmt.Println(index, a)
if index == { //启动第九个goroutine的时候就可以告诉main函数可以退出了,
//多核的时候index=9不一定是最后执行的,所以不一定会执行9遍,有可能执行一遍就退出了,解决方法:缓存的channel
c <- true
}
}
package main

import (
"fmt"
"runtime"
) //缓存的channel
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
c := make(chan bool, ) //缓存的channel,缓存10个,
for i := ; i < ; i++ {
go GO1(c, i)
}
for i := ; i < ; i++ {
<-c //取10次,就知道goroutine执行完了,这样就保证了能够打印10 次
}
} func GO1(c chan bool, index int) {
a := for i := ; i < ; i++ {
a +=
}
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个任务 for i := ; i < ; 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
*/

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

  1. golang并发编程goroutine+channel(一)

    go语言的设计初衷除了在不影响程序性能的情况下减少复杂度,另一个目的是在当今互联网大量运算下,如何让程序的并发性能和代码可读性达到极致.go语言的并发关键词 "go" go dos ...

  2. Golang 并发concurrency

    并发concurrency 很多人都是冲着Go大肆宣扬的高并发而忍不住跃跃欲试,但其实从源码解析来看,goroutine只是由官方实现的超级"线程池"而已.不过话说回来,每个实例4 ...

  3. GO_11:GO语言基础之并发concurrency

    并发Concurrency 很多人都是冲着 Go 大肆宣扬的高并发而忍不住跃跃欲试,但其实从源码的解析来看,goroutine 只是由官方实现的超级“线程池”而已.不过话说回来,每个实例 4-5KB的 ...

  4. GO语言基础之并发concurrency

    并发Concurrency 很多人都是冲着 Go 大肆宣扬的高并发而忍不住跃跃欲试,但其实从源码的解析来看,goroutine 只是由官方实现的超级“线程池”而已.不过话说回来,每个实例 4-5KB的 ...

  5. Go语言学习笔记(七)杀手锏 Goroutine + Channel

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 Goroutine Go语言的主要的功能在于令人简易使用的并行设计,这个方法叫做Goroutine,通过Gorou ...

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

    我感觉很多项目使用java或者c的多线程库+线程安全的queue数据结构基本上可以实现goroutine+channel开发能达到的需求,所以请问一下为什么说golang更适合并发服务端的开发呢?使用 ...

  7. 并发(Concurrency)和并行(Parallelism)的区别

    最近在读<real world haskell>里关于并行的一章时,看到作者首先对并发(Concurrency)和并行(Parallelism)的区别进行了定义和解释.以前我对这个问题也是 ...

  8. 并行(Parallelism)与并发(Concurrency)

    并行(Parallelism):多任务在同一时刻运行.例如,多个任务在多核处理器上运行. 并发(Concurrency):两个或者两个以上的任务在一段时间内开始.运行.完成,这意味着它们不是在同一时刻 ...

  9. 【转】关于 Goroutine Channel Select 的用法和理解

    原文:https://blog.csdn.net/jfkidear/article/details/88661693 ----------------------------------------- ...

随机推荐

  1. C++ 指针形参和指针引用形参的原理分析

    C++ 函数的参数传递可以分为:值传递和引用传递. 两者的最大区别也很简单,如果该函数的参数只是读的话,值传递就可以满足.如果该函数的参数需要进行修改并返回的时候,就应该进行引用传递. C++指针作为 ...

  2. action类中属性驱动和模型驱动的区别

    1.Struts2的属性驱动 在Action类中,属性××通过get××()和set××()方法,把参数在整个生命周期内进行传递,这就是属性驱动 代码如下: package org.abu.csdn. ...

  3. 零基础入门学习Python(20)--函数:内嵌函数和闭包

    知识点 global关键字 使用global关键字,可以修改全局变量: >>> count = 5 >>> def Myfun(): count = 10 prin ...

  4. lucene-5.3.1配置(win7x64)

    lucene下载地址:http://www.us.apache.org/dist/lucene/java/5.3.1/lucene-5.3.1.zip 下载之后解压 控制台应用程序下配置: 找到luc ...

  5. 数据结构代码实现之队列的链表实现(C/C++)

    上班闲着无聊,一直想着要开始写博客,但又不知道写什么.最近又回顾了下数据结构的知识,那就从数据结构开始吧. 前言 关于C语言结构体的知识以及队列的特性请读者自行了解,此处不做过多解释,嘻嘻. 同时此篇 ...

  6. 集训第四周(高效算法设计)B题 (二分查找优化题)

    ---恢复内容开始--- Description   Before the invention of book-printing, it was very hard to make a copy of ...

  7. java设置项目根目录 工作目录 working dictionary

    改变java项目中,绝对路径的根目录 run->run configuration ->Arguments 更改 working dictioinary

  8. 动态规划之最长递增子序列(LIS)

           在一个已知的序列{ a1,a2,……am}中,取出若干数组成新的序列{ ai1, ai2,…… aim},其中下标 i1,i2, ……im保持递增,即新数列中的各个数之间依旧保持原数列中 ...

  9. hdu 4871 树的分治+最短路记录路径

    /* 题意:给你一些节点和一些边,求最短路径树上是k个节点的最长的路径数. 解:1.求出最短路径树--spfa加记录 2.树上进行操作--树的分治,分别处理子树进行补集等运算 */ #include& ...

  10. Flask基础(3):session、flash、特殊装饰器、蓝图、路由正则匹配、上下文管理 & flask-session

    Session: Flask 默认将 session 以加密的形式放到了浏览器的 cookie 中 Flask 的 session 就是一个字典,字典有什么方法 session 就有什么方法 flas ...