• go语言中的goroutine(协程)


    文章目录

    goroutine(协程)

    1.进程和线程说明:

    1. 进程就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位。
    2. 线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位。
    3. 一个进程可以创建和销毁多个线程,同一个进程中的多个线程可以并发执行。
    4. 一个程序至少有一个进程,一个进程至少有一个线程。

    2.并发和并行说明:

    1. 多线程程序在单核上运行,就是并发。
    2. 多线程程序在多核上运行,就是并行。

    3.go协程和go主线程:

    1. go主线程(有程序员直接称为线程/也可以理解成进程):一个go线程上,可以起多个协程。可以理解为:协程是轻量级的线程(编译器做优化)。
    2. go协程的特点:
      1)有独立的栈空间
      2)共享程序堆空间
      3)调度由用户控制
      4)协程是轻量级的线程

    goroutine-快速入门案例
    案例说明:
    编写一个程序,完成如下功能:
    1)在主线程(可以理解为进程)中,开启一个goroutine,该协程每隔一秒输出 “hello,world”
    2)在主线程中也每隔一秒输出 “hello,golang”,输出10次后,退出程序
    3)要求主线程和goroutine同时执行

    package main
    
    import (
    	"fmt"
    	"strconv"
    	"time"
    )
    
    //编写一个函数,每隔一秒输出 "hello,world"
    func test() {
    	for i:=1;i<=10;i++ {
    		fmt.Println("test hello,world "+strconv.Itoa(i))
    		time.Sleep(time.Second)
    	}
    }
    func main() {
    
    	go test() //开启了一个协程,使其同时执行
    	for i:=1;i<=10;i++ {
    		fmt.Println("mian() hello,world "+strconv.Itoa(i))
    		time.Sleep(time.Second)
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    小结:

    1. 主线程是一个物理线程,直接作用在cpu上。是重量级的,非常耗费cpu资源。
    2. 协程是从主线程开启的,是轻量级的线程,是逻辑态。对资源消耗相对小。
    3. Golang的协程机制是重要的特点,可以轻松地开启上万个协程。其它编程语言的并发机制是一般基于线程的,开启过多的线程,资源耗费大,这里就突显了Golang在并发上的优势了。

    4.MPG 模式基本介绍

    M:操作系统的主线程(是物理线程)
    P:协程执行需要的上下文
    G:协程
    在这里插入图片描述
    在这里插入图片描述

    5.设置golang运行的cpu数

    package  main
    import "fmt"
    import "runtime"
    func main() {
      //获取当前系统的cpu数量
      num := runtime.NumCPU()
      //在这里设置num-1的cpu运行go程序
      runtime.GOMAXPROCS(num)
      fmt.Println("num =",num)
    }
    //输出结果:num = 16
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注:go1.8后,默认让程序运行在多个核上,可以不用设置了。 go1.8前,需要设置。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    Netty基础入门和基本使用
    支持JDK19虚拟线程的web框架,之三:观察运行中的虚拟线程
    【程序员面试金典】01.02. 判定是否互为字符重排
    vue--前端路由及vue-router两种模式
    ARM架构的基本知识
    混凝土板材及砌块生产线数字孪生可视化管理系统,实现智慧工厂车间智能化数字化管理
    NoSQL之Redis配置与基础命令
    为什么LTD独立站就是Web3.0网站!
    余额宝收益怎么算
    自身免疫疾病诊断原料厂家——博迈伦
  • 原文地址:https://blog.csdn.net/Ajekseg/article/details/126056915