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. js 技巧 (六)JavaScript[对象.属性]集锦

    JavaScript[对象.属性]集锦 SCRIPT 标记 用于包含javascript代码. 语法 属性 LANGUAGE 定义脚本语言 SRC 定义一个URL用以指定以.JS结尾的文件 windo ...

  2. 集训第四周(高效算法设计)H题 (贪心)

    Description   Most financial institutions had become insolvent during financial crisis and went bank ...

  3. python字典及相关操作

    1.字典 1.1.字典特性 字典是一种key-value的数据类型.key必须可hash,必须为不可变数据类型,且必须是唯一的:value可以存放任意多个值.可修改.可以不唯一:字典是无序的,通过ke ...

  4. source insight中的快捷键总结

    1.快捷键 1,Shift+F8高亮显示指定字符. 2,Ctrl+F找出来的结果用F4,F3前进后退查找. 3,Alt+,后退alt+.前进查找关键字. 4,Alt+G或者F5跳转到某个固定的行号. ...

  5. String字符串类的获取功能

    StringDemo.java /* * String类的获取功能: * int length():获取字符串的长度,其实也就是字符个数 * char charAt(int index):获取指定索引 ...

  6. 九度oj 题目1062:分段函数

    题目1062:分段函数 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3874 解决:2278 题目描述: 编写程序,计算下列分段函数y=f(x)的值.y=-x+2.5; 0<=x& ...

  7. 全排列函数 nyoj 366(next_permutation()函数)

    C++ STL中提供了std::next_permutation与std::prev_permutation可以获取数字或者是字符的全排列,其中std::next_permutation提供升序.st ...

  8. [luoguP1013] 进制位(搜索)

    传送门 纯搜索,无优化! #include <cstdio> #include <cstring> #include <iostream> #include < ...

  9. [K/3Cloud] 创建一个业务单据表单插件

    概念 创建一个业务单据插件,处理单据的相关控制逻辑. 示例 新建一个类,继承自单据插件基类Kingdee.BOS.Core.Bill.PlugIn.AbstractBillPlugIn. using ...

  10. 桐桐的糖果计划(vijos 1325)

    背景 桐桐是一个快乐的小朋友,他生活中有许多许多好玩的事,让我们一起来看看吧…… 描述 桐桐很喜欢吃棒棒糖.他家处在一大堆糖果店的附近. 但是,他们家的区域经常出现塞车.塞人等情况,这导致他不得不等到 ...