main.go
// Go语言·协程Goroutine·管道Channel
package main
import (
model "day30/model"
)
var content string = `
————————————————Go语言·协程Goroutine·管道Channel————————————————————
一、进程和线程
1.进程是程序在操作系统中的一次执行过程。是系统进行
资源分配和调度的基本单位
2.线程是进程的一个执行实例,是程序执行的最小单元,
它是比进程更小的能独立运行的基本单位
3.一个进程可以创建和销毁多个线程,同时一个进程中的
多个线程可以并发执行。
4.一个程序至少有一个进程,一个进程至少有一个线程。
二、并发和并行
1.多线程程序在单核上运行,就是并发
.多个任务作用在一个CPU上
.从微观的角度看,在某一个时间点,其实只有一个任务在执行
.进行轮询操作。
2.多个线程程序多核上运行,就是并行
.多个任务作用在多个CPU上
.每个线程都在各自不同的CPU上执行
.从微观的角度看,在某一个时间点,多个线程同时在执行
三、Go协程和Go主线程
1.Go主线程(简称:线程、也可以理解为进程):一个Go线程上,可以
起多个协程,协程是轻量级的线程[编译器做咯优化]
2.Go协程的特点:
a.有独立的栈空间
b.共享程序堆空间
c.调度由用户控制
d.协程是轻量级的线程
四、小结
1.主线程是一个物理线程,直接作用在CPU上的,是重量级的,非常耗费CPU
资源。
2.协程是主线程开启的,是轻量级的,是逻辑态,对资源消耗相对小。
3.Golang的协程 :可以轻松开启上万个协程。
其他编程语言的并发机制:一般基于线程的,开启过多的线程,资源消耗大,
五、MPG模式
M:操作系统的主线程(是物理线程)
P:协程执行需要的上下文
G:协程
六、Cpu
// 获取CPU
cpuNum := runtime.NumCPU()
fmt.Println(cpuNum)
// 设置使用多个CPU
// 1.8后,默认程序运行在多个核心上,不用设置咯。
runtime.GOMAXPROCS(cpuNum-1)
fmt.Println("ok")
`
func main() {
model.Entry()
}
Utils.go
package model
import (
"fmt"
"strconv"
"time"
"runtime"
)
/**
* [Init 入口]
* @author Jhou Shuai
* @datetime 2019-05-18T11:58:33+0800
*/
func Entry() {
}
func cpuInfo() {
// 获取CPU
cpuNum := runtime.NumCPU()
fmt.Println(cpuNum)
// 设置使用多个CPU
// 1.8后,默认程序运行在多个核心上,不用设置咯。
runtime.GOMAXPROCS(cpuNum-1)
fmt.Println("ok")
}
func going() {
go test()
for i := 0; i <10; i++ {
fmt.Println("[main]Hello MyGboy !"+strconv.Itoa(i))
time.Sleep(time.Second)
}
}
// 开启一个协程
func test() {
for i := 0; i <10; i++ {
fmt.Println("[Test]Hello world !"+strconv.Itoa(i))
time.Sleep(time.Second)
}
}
网友评论