[Golang] goroutine

news2024/11/25 12:49:37

[Golang] goroutine

文章目录

  • [Golang] goroutine
    • 并发
      • 进程和线程
      • 协程
    • goroutine
      • 概述
      • 如何使用goroutine

并发

进程和线程

谈到并发,大多都离不开进程和线程,什么是进程、什么是线程?

  • 进程可以这样理解:进程就是运行着的程序,它是程序在操作系统的一次执行过程,是一个程序的动态概念,进程是操作系统分配资源的基本单位

  • 线程可以这样理解:线程是一个进程的执行实体,它是比进程粒度更小的执行单元,也是真正运行在cpu上的执行单元,线程是CPU调度资源的1基本单位

进程可以包含多个进程,需要记住的是进程和线程,一个是操作系统分配资源的基本单位,一个是操作系统调度的基本单位。

协程

协程可以理解为用户态线程,是更轻量级的线程。区别于线程,协程的调度在用户态进行,不需要切换到内核态,所以不由操作系统参与,由用户自己控制。在一些支持协程的高级语言中,大多都实现了自己的协程调度器,比如golang就有GMP模型、python就有asyncio等等。

  • 协程有独立的栈空间,但是共享堆空间
  • 一个进程可以跑多个线程,一个线程可以跑多个协程

goroutine

概述

goroutine就是golang对协程的支持,可以把它理解为golang的协程。

golang的并发只会用到goroutine,所以我们并不用去考虑使用进程、线程。一般线程栈本身大小大约是2MB,而且线程在切换上下文时是消耗资源的,会带来性能消耗,所以我们往往在使用多线程技术时,会通过池化技术,即创建线程池来管理一定数量的线程。

但是在golang中,一个goroutine栈在一开始占用的空间很小,一般只有2KB,并且它的栈大小可以按需求变大或者变小,最大时可以达到1GB(但是一般不用这么大)。所以在golang中一次创建成千上万个或10万个协程理论上也是有可能的。

在golang中,我们使用goroutine完成并发,在某个任务需要并发执行时,只需要把这个任务包装成一个函数,去开启一个goroutine去执行这个函数即可。我们不用维护一个线程池类似的东西,也不需要去关心协程是怎么切换和调度的,因为golang已经内置了调度器帮我们做了,并且效率非常高。

如何使用goroutine

func()
go func()//并发执行

和其他语言相同,golang程序的入口就是main函数。在程序开始执行时,Go程序会为main函数创建一个默认的goroutine,我们称为主协程,我们后来人为的创建的一些goroutine,都是在这个主协程上执行的。

比如:

package main

import "fmt"

func myGoroutine() {
	fmt.Println("son")
}

func main() {
	go myGoroutine()
	fmt.Println("father")
}

运行结果:

image-20240912204217798

但是为什么只有主协程在打印,我们创建的协程没有进行打印呢?

这是因为,当main()函数返回时这个goroutine也就是结束了,主协程结束,其他协程不管是不是运行完,都会跟着结束。所以,当主协程打印完“father”返回后,myGoroutine协程还没来的及运行到打印也就是跟着返回了。

所以,我们想看到都打印,只需要让主协程等待几秒就可以了。

package main

import (
	"fmt"
	"time"
)

func myGoroutine() {
	fmt.Println("son")
}

func main() {
	go myGoroutine()
	fmt.Println("father")
	time.Sleep(2 * time.Second)
}

运行结果:

image-20240912204705774

后面还有更好的方法,不用再让主协程睡眠了。

比如:

package main

import (
	"fmt"
	"sync"
	"time"
)

func myGoroutine(name string, wg *sync.WaitGroup) {
	defer wg.Done()
	for i := 0; i < 2; i++ {
		fmt.Printf("myGoroutine %s\n", name)
		time.Sleep(1 * time.Second)
	}
}

func main() {
	var wg sync.WaitGroup
	wg.Add(2)
	go myGoroutine("张三", &wg)
	go myGoroutine("李四", &wg)
	time.Sleep(2 * time.Second)
	wg.Wait()
}

运行结果:

image-20240912205414100

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2129092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

根据NVeloDocx Word模板引擎生成Word(四)

前面介绍了《E6低代码开发平台》的Word模版引擎NVeloDocx&#xff0c;实现了表单的基本字段、子表、单张图片、二维码、条形码怎么基于NVelocity脚本输出到Word文件&#xff0c;都是些比较简单且常用的需求。 本篇介绍怎么基于NVeloDocx在Word中插入图表&#xff0c;目前只支持…

Java学习 - JDBC

JDBC 这是一些我跟着网课上的JDBC的内容&#xff0c;进行了稍稍的整理 1&#xff0c;JDBC概述 在开发中我们使用的是java语言&#xff0c;那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。 1.1 JDBC概念 JDBC 就是使用Java语言操作关系型数据库的一套…

24 家国内大模型面经及考点总结!

我意识到有很多经验和知识值得分享给大家&#xff0c;也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑&#xff0c;所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限&#xff0c;很多互联网行业朋友无法获得正确的资料得到学习提升&#…

大模型书籍丨深入浅出的 Transformer 学习,这本大模型应用解决方案太香了

说到Transformer&#xff0c;这个已经是无数人谈论的神经网络的基础架构之一了。但是这期间又有无数的好的&#xff0c;极好的&#xff0c;不好的信息&#xff0c;所以如果你要真的了解它&#xff0c;找本好书来仔细看一下&#xff0c;其实是对得起自己的最好方式&#xff01; …

企业数据端口和储备设备防泄漏:端口管控软件是什么?

端口管控软件是什么&#xff1f;端口管控&#xff1a;系统基于Windows底层驱动&#xff0c;可智能识别存储设备的类型为海量存储还是非海量存储&#xff0c;不影响USB键盘、鼠标和打印机等接入设备的正常使用; 针对不同的计算机可自定义设置USB端口的读写模式&#xff0c;可设定…

视频编辑SDK解决方案,包含丰富的模板方案

美摄科技作为视频编辑技术的领航者&#xff0c;携其革命性的视频编辑SDK解决方案&#xff0c;正以前所未有的方式&#xff0c;赋能每一位创作者&#xff0c;让图片与视频的碰撞擦出最耀眼的火花&#xff0c;轻松打造个性化、高质量的Vlog作品&#xff0c;满足从日常分享到专业制…

OJ 删除链表的倒数第N个结点

题目&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点 示例&#xff1a; 代码思路&#xff1a; //方法一&#xff1a;class Solution { public: //使用双指针算法ListNode* removeNthFromEnd(ListNode* head, int n) { i…

通信工程学习:什么是MRF多媒体资源功能、MRFC多媒体资源功能控制、MRFP多媒体资源功能处理

一、MRF多媒体资源功能 MRF&#xff08;Multimedia Resource Function&#xff0c;多媒体资源功能&#xff09;是3G/IMS网络中定义的提供多媒体资源功能的网络实体&#xff0c;它为3G/IMS网络的业务和承载提供媒体能力支持。MRF通过提供丰富的媒体处理功能&#xff0c;如播放声…

MySQL之库和表操作

目录 一&#xff1a;对库的操作 1.创建数据库 2.查看数据库列表 3.显示创建数据库的语句 4.删除数据库 5.字符集与校验集 6.确认当前所处的数据库 7.修改数据库 8.备份和恢复 9.查看连接情况 二:对表的操作 1.创建表 2.查看表 3.删除表 4.修改表 接下来的日…

【进展报告】9.9-9.12

一、进度概述 1、推进关于滤波的相关任务&#xff08;详情见相关文件&#xff09; 二、详情 1、噪声与滤波模块 在师兄 inversionnet 的基础上&#xff0c;在正则化模块前后添加了对应的噪声和滤波模块。 噪声采用的是最基本的高斯噪声和椒盐噪声&#xff0c;关于其他…

OpengGL学习-显示三维形状

本文介绍了OpenGL创建三维图形的几个示例程序。并附有OpenGL创建三维形状的基础示例代码。本文还介绍了OpenGL基础知识&#xff0c;并对Vulkan做了简介。Vulkan性能更强大&#xff0c;但对开发技术人员要求更高&#xff0c;对兼容性的风险和工作量要有充分的认识。兼容性不仅存…

通信工程学习:什么是MGCF多媒体网关控制功能

MGCF&#xff1a;多媒体网关控制功能 MGCF&#xff08;Media Gateway Control Function&#xff0c;多媒体网关控制功能&#xff09;是IP多媒体子系统&#xff08;IMS&#xff09;网络中的一个关键组件&#xff0c;主要负责实现IMS网络和传统电路交换网络&#xff08;如PSTN、I…

2024年【建筑焊工(建筑特殊工种)】考试技巧及建筑焊工(建筑特殊工种)作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 建筑焊工(建筑特殊工种)考试技巧考前必练&#xff01;安全生产模拟考试一点通每个月更新建筑焊工(建筑特殊工种)作业考试题库题目及答案&#xff01;多做几遍&#xff0c;其实通过建筑焊工(建筑特殊工种)在线考试很简…

springboot 项目获取 yaml/yml (或 properties)配置文件信息

文章目录 springboot 项目获取配置文件信息前言1、 Autowired 注入 Environment类2、基础用法&#xff0c;使用Value注解直接注入配置信息3、进阶方法&#xff08;推荐使用&#xff09;拓展&#xff1a;springboot 集成配置中心 - 以 Apollo 为例 springboot 项目获取配置文件信…

YOLO配合 PYQT做自定义虚拟电子围-自定义绘制多边形虚拟电子围栏

电子围栏标注以及显示 1、目标检测&#xff1a; YOLO可以识别检测物体&#xff0c;这是众所周知的。使用YOLO来做目标检测&#xff0c;并获取坐标信息。 2、电子围栏 比如在监控中&#xff0c;指定一块区域&#xff0c;如果有目标进入&#xff0c;则发出警报&#xff0c;并提…

写的一致性问题之失效模式

文章目录 1、先删除redis缓存&#xff0c;再写入mysql&#xff1a;1.1、高并发情况下分析出现的问题 1、先删除redis缓存&#xff0c;再写入mysql&#xff1a; 此时删除redis成功&#xff0c;写入mysql成功&#xff0c;此时redis是空&#xff0c;mysql是新数据。此时删除redis…

财富通公司开发洗车小程序有哪些用处?

洗车小程序具有多种用处&#xff0c;主要体现在以下几个方面&#xff1a; 1.便捷预约服务&#xff1a;用户可以通过洗车小程序轻松预约洗车服务&#xff0c;无需亲自前往洗车店或打电话预约&#xff0c;节省了时间和精力。同时&#xff0c;小程序通常提供多种预约时间选项&…

Java进阶13讲__补充1/2

单元测试、反射、注解、Lombok 1. 单元测试 1.1 Junit单元测试框架 1.2 Junit框架入门 package com.itheima.a_单元测试;import org.junit.Test;public class SpringUtilTest {Testpublic void testPrintNumber() {StringUtil.printNumber("Jack");StringUtil.pri…

go 笔记

数据结构与 方法&#xff08;增删改查&#xff09; 安装goland,注意版本是2024.1.1&#xff0c;不是2024.2.1&#xff0c;软件下载地址也在链接中提供了 ‘go’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 在 Windows 搜索栏中输入“环境变量”&#…

Windows上安装RabbitMQ

rabbitmq是干嘛的我就不介绍了&#xff0c;直接开始安装教程。 搭建成功演示图 下载安装包 https://pan.baidu.com/s/1ZlCFxh9Q00ynSU3ZCpTC9Q?pwdry51​pan.baidu.com/s/1ZlCFxh9Q00ynSU3ZCpTC9Q?pwdry51 下载完后有两个包(erlang和rabbitmq) 先安装otp_win64_24.1.7.exe…