Golang 协程、主线程

Go协程、Go主线程


1)Go主线程(有程序员直接称为线程/也可以理解成进程):一个Go线程上,可以起多个协程,你可以这样理解,协程是轻量级的线程。

2)Go协程的特点

· 有独立的栈空间

· 共享程序堆空间

·调度由用户控制

· 协程是轻量级的线程

go线程-协程

CSDN @富士康质检员张全蛋

编译器做了优化

线程虽然好,可以做到并发。但是线程还是比较吃资源,吃资源和占用cpu资源比较多。

现在就是要解决,能不能让cpu全部都参与工作。其次就是线程有点笨重,这样就需要在底层做一些优化,这样线程就变的更加轻巧了。同时在线程之间可以做到资源的共享。

在主线程里面可以跑很多很多的协程。

一旦开启了一个协程,它们的数据空间是独立的。

协程的开启和终止可以有程序员去控制的。

开启协程,一般以函数为单位进行开启的.如果不使用go test(),那么就是顺序执行的。

如果开启了协程就是穿插着执行了。

Go 复制代码
package main

import (
	"fmt"
	"strconv"
	"time"
)

func test() {
	for i := 0; i < 5; i++ {
		fmt.Println("hello test()" + strconv.Itoa(i))
		time.Sleep(time.Duration(1) * 1)
	}
}

func main() {
	//开启了一个协程
	go test()
	for i := 0; i < 5; i++ {
		fmt.Println("hello main()" + strconv.Itoa(i))
		time.Sleep(time.Duration(1) * 1)
	}
}

hello main()0
hello test()0
hello main()1
hello test()1
hello test()2
hello main()2
hello main()3
hello test()3
hello test()4
hello main()4

输出效果说明,main这个主线程和test协程同时执行。

当执行main的时候就开启了一个主线程,往下执行发现go test(),这样就会开启一个新的分支然后执行,但是主线程并没有阻塞,它会继续往下走,发现for循环去执行,执行完毕主线程就退出。

记住:只要开启了协程就相当于程序多了一个分支。

相关推荐
牛奔3 小时前
Go 如何打印调试深层或嵌套的结构体
开发语言·后端·golang
geovindu4 小时前
go: Iterative Algorithms
开发语言·后端·算法·golang·迭代算法
kite01215 小时前
Go语言Map深度解析与最佳实践
开发语言·后端·golang
Wang's Blog18 小时前
Go-Zero 项目开发21: 实现离线消息拉取与会话管理
开发语言·后端·golang
FfHUCisI19 小时前
Golang学习-约瑟夫环问题(Josephus Problem)
开发语言·学习·golang
会编程的土豆19 小时前
结构体 struct:用代码描述用户、订单、座位
数据库·mysql·golang
llwszx2 天前
【Java/Go后端手撸原生Agent(第九篇):Plan-and-Execute规划模式——从“走一步看一步“到“先谋后动“】
java·python·golang·agent开发·plan模式·规划执行模式
灯澜忆梦2 天前
GO_网络编程---文件传输实战
网络·golang·php
北冥you鱼2 天前
Go 语言新手扫盲:指针 * 和 & 使用场景详解
开发语言·后端·golang
Wang's Blog2 天前
Go-Zero项目开发17: IM私聊功能实现与消息存储设计
开发语言·后端·golang