Golang中的协程(goroutine)

news2024/12/25 12:27:21

目录

进程

线程

并发

并行

协程(goroutine)

 使用sync.WaitGroup等待协程执行完毕

多协程和多线程


进程

        进程就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。一个进程至少有5种基本状态:初始状态,执行状态,等待状态,就绪状态,终止状态。通俗的讲,进程就是一个正在执行的程序。

线程

        线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位。一个进程可以创建多个线程,同一个进程中的多个线程可以并发执行,一个程序要运行的话至少有一个进程。

并发

        并发是指在同一时间段内处理多个任务,通过多个任务之间的切换,使得在表面上看来是同时进行的。在 Go 语言中,可以使用 goroutine 和 channel 实现并发编程。

特点:

  • 多个任务作用在一个CPU上面

  • 同一时间点只能有一个任务执行

  • 同一时间段内执行多个任务

并行

        并行是指同时处理多个任务,即多个任务同时在不同的处理器上进行执行。并行可以显著提高程序的性能,特别是在多核 CPU 中,能够利用多个 CPU 核心进行计算。在 Go 语言中,可以使用 goroutine 和 runtime 包的 GOMAXPROCS 函数实现并行编程。

特点:

  • 多个任务作用在多个CPU上面

  • 同一时刻执行多个任务

        通俗的讲,多线程程序在单核CPU上面运行就是并发,多线程程序在多核CUP上运行就是并行,如果线程数大于CPU核数,则多线程程序在多个CPU上面运行既有并行也有并发。

协程(goroutine)

        在 Go 语言中,协程(goroutine)是轻量级的线程,它是 Go 语言中实现并发编程的基础。与传统的线程相比,协程的创建和切换都非常轻量级,可以在单个线程内创建成千上万个协程,且切换开销非常小,因此可以实现高效的并发编程。

        Go 语言中的协程是由 Go 运行时调度器(scheduler)进行管理和调度的。当程序启动时,Go 运行时会默认启动一个主协程,主协程会创建其他的子协程,这些协程会被分配到不同的系统线程上进行执行。当某个协程发生阻塞时,Go 运行时会将该协程挂起并让出 CPU,转而执行其他协程,以充分利用系统资源。

在 Go 语言中,创建协程非常简单,只需要在函数调用前加上 go 关键字即可。

例如:

func main() {
    go func() {
        fmt.Println("Hello, world!")
    }()
}

 使用sync.WaitGroup等待协程执行完毕

func test1() {

    for i := 0; i < 10; i++ {

        //每100毫秒输出一次

        fmt.Println("test1() 你好Golang-", i)

        time.Sleep(time.Millisecond * 100)

    }

    wg.Done() //协程计数器加-1

}

func main() {
    //注意:

    //1.主线程执行完毕后即使协程没有执行完毕程序也会退出

    //2.协程可以在主线程没有执行完毕前提前退出,协程是否执行完毕不会影响主线程的执行

    //为了保证我们的程序可以顺利执行,我们想让协程执行完毕后再执行主进程退出,

    //这个时候我们可以使用sync.WaitGroup等待协程执行完毕

    wg.Add(1)  //协程计数器加1

    go test1() //表示开启一个协程

    for i := 0; i < 10; i++ {

        //每50毫秒输出一次

        fmt.Println("mian() 你好Golang-", i)

        time.Sleep(time.Millisecond * 50)

    }

    wg.Wait() //等待协程执行完毕

    fmt.Println("主线程退出。。。")
}

多协程和多线程

        Golang中每个goroutine(协程)默认占用内存比Java、C的线程少。OS线程(操作系统线程)一般都有固定的栈内存(通常为2MB左右),一个goroutine(协程)占用内存非常少,只有2KB左右,多协程切换调度开销方面远比线程要少。这也是为什么越来越多的大公司使用Golang的原因之一。

func test1() {

    for i := 0; i < 10; i++ {

        //每100毫秒输出一次

        fmt.Println("test1() 你好Golang-", i)

        time.Sleep(time.Millisecond * 100)

    }

    wg.Done() //协程计数器加-1

}

func test2() {

    for i := 0; i < 10; i++ {

        //每100毫秒输出一次

        fmt.Println("test2() 你好Golang-", i)

        time.Sleep(time.Millisecond * 100)

    }

    wg.Done() //协程计数器加-1

}

func main() {
    wg.Add(1)  //协程计数器加1

    go test1() //表示开启一个协程

    wg.Add(1)  //协程计数器加1

    go test2() //表示开启一个协程

    wg.Wait()

    fmt.Println("主程序退出。。。")
}

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

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

相关文章

C语言_用VS2019写第一个C语言或C++程序

接上一篇&#xff1a;C语言简述、特点、常用编译器&#xff0c;VS2010写第一个C语言程序 本次来分享用VS2019来写C语言或C程序&#xff0c;也是补充上一篇的知识&#xff0c;话不多说&#xff0c;开始上菜&#xff1a; 此博主在CSDN发布的文章目录&#xff1a;我的CSDN目录&…

微信小程序nodejs+vue+uniapp超市网上购物商城系统

超市购物系统用户端要求在系统的安卓手机上可以运行&#xff0c;主要实现了管理端&#xff1b;首页、个人中心、用户管理、商品分类管理、商品信息管理、商品入库管理、订单信息管理、订单配送管理、订单评价管理、退货申请管理、换货申请管理、系统管理&#xff0c;用户端&…

总结857

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;张宇强化前10讲&#xff0c;背诵15篇短文&#xff0c;熟词僻义300词基础词&#xff09; 周目标&#xff1a;张宇强化前3讲并完成相应的习题并记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#…

4-《安卓进阶》

4-《安卓进阶》 1 Okhttp2 Retrofit3 Android常用图片库对比4 Glide原理手写图片加载框架思路5 Rxjava6 Android IPC机制&#xff08;面试八股文之一&#xff09;6.1.Android中进程和线程的区别6.2.IPC概念6.3.Android序列化与反序列化6.3.Android如何开启多进程&#xff1f;多…

MDIO总线

基于linux-3.14.16 首先要搞清楚总线的位置&#xff0c;即硬件上的位置 如上图&#xff0c;mdio总线是mac和phy之间的连接方式&#xff0c;主要用于配置配置phy的寄存器&#xff0c;所以phy应该是器的一类物理设备&#xff0c;mdio总线驱动和总线设备都是围绕phy工作的。 一…

一图看懂 async_timeout 模块:异步 I/O 的超时设置,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 async_timeout 模块&#xff1a;异步 I/O 的超时设置&#xff0c;资料整理笔记&#xff08;大全&#xff09; &#x1f9ca;摘要&#x1f9ca;模块图&#x1f9ca;类关系图…

chatgpt赋能Python-pythonfrozenset

Python frozenset介绍 在Python中&#xff0c;可以通过frozenset创建不可变集合。与set不同&#xff0c;frozenset一旦被创建就无法修改。frozenset通常用于作为字典的键&#xff0c;因为字典键必须是不可变的。 如何创建frozenset frozenset可以通过将可迭代对象作为参数传…

Blazor实战——Known框架快速开始

Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 开源地址: https://gitee.com/known/Known 1. 安装项目模板并创建新项目 打开命令行输入如下命令安装和创建。 -- 安装模板 dotnet n…

chatgpt赋能Python-pythonformat的用法小数点位数

Python中的format函数和小数点位数 介绍 Python中的format函数是一种格式化输出字符串的方法&#xff0c;允许你使用占位符来指定输出的格式。你可以使用format函数来格式化字符串&#xff0c;比如确定字符串的长度、插入变量或按特定格式输出字符串。 在本文中&#xff0c;…

Xubuntu22.04之自动调节亮度护眼redshift(一百七十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

chatgpt赋能Python-pythonfib

Pythonfib&#xff1a;一个优秀的计算斐波那契数列的Python函数 斐波那契数列是一种非常有趣也非常常见的数列&#xff0c;它起源于数学但在计算机科学中也经常被用到。Pythonfib是一个优秀的Python函数&#xff0c;可以用来计算斐波那契数列。本文将对Pythonfib进行详细介绍&…

本地电脑搭建Plex私人影音云盘教程,内网穿透实现远程访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转发自CSDN远程穿透的文章&#xff1a;免费搭建Plex家庭影音中心 - 打造超级多媒体中心【公网远程访问…

【红队系列】外网信息收集(二)

红队系列 &#x1f525;系列专栏&#xff1a;红队系列 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2023年5月20日&#x1f334; &#x1f36d;作者水平很有限&#xff0c;如果发现错误&…

chatgpt赋能Python-pythondescribe

PythonDescribe&#xff1a;更快、更准确、更易用的Python文档生成工具 介绍 Python是一种在数据科学和Web开发等领域广泛应用的高级编程语言。但是&#xff0c;在编写Python代码时&#xff0c;文档的编写常常被忽视。文档的缺失会使代码难以理解、维护和重复使用。幸运的是&…

基于MAC地址的ACL配置

基于MAC地址的ACL配置 【实验目的】 掌握基于MAC地址的标准ACL的配置。验证配置。 【实验拓扑】 实验拓扑如图1所示。 图1 实验拓扑 设备参数如表所示。 表1 设备参数表 设备 接口 IP地址 子网掩码 默认网关 S1 e0/0 N/A N/A N/A e0/1 N/A N/A N/A PC1 N/…

chatgpt赋能Python-pythonfloat设置精度

Python float设置精度 在Python中&#xff0c;float是一种表示小数的数据类型。但是在某些情况下&#xff0c;我们可能需要设置float的精度&#xff0c;以避免舍入误差造成的问题。在本文中&#xff0c;我们将介绍如何在Python中设置float的精度。 为什么需要设置float的精度…

芯片设计全流程知识点总结

1、低功耗工具 功耗分析预测分析工具包括PowerArtist&#xff08;Ansys&#xff09;、Spyglass Power&#xff08;Synopsys&#xff09;、Prime Time PX&#xff08;Synopsys&#xff09;和Redhawk&#xff08;Ansys&#xff09;等。通过对实际项目中&#xff1b;不同工具的比…

单片机GD32F303RCT6 (Macos环境)开发 (二十二)—— FreeRTOS的移植

GD32F303RCT6 FreeRTOS的移植 1、在Application的Makefile中增加freertos的编译选项&#xff0c;如下&#xff1a; ENABLE_FREERTOS yes ifeq ($(ENABLE_FREERTOS), yes) APPLICATION_FLAGS \ -DENABLE_FREERTOS endif2、Application目录下增加FreeRtos目录&#xff0c;将下…

chatgpt赋能Python-pythoncuda

PythonCUDA:将Python与GPU相结合的高性能计算工具 介绍 Python是一种简单易学的高级编程语言&#xff0c;而NVIDIA CUDA是一种基于GPU的并行计算平台。两者结合&#xff0c;可以实现高性能计算&#xff0c;Python可以做到数据处理方便快捷&#xff0c;而CUDA则以其强大的并行…

【拼题A】 520 钻石争霸赛 2023 题解

520-1 520无尽爱 分数 5 作者 陈越 单位 浙江大学 《I Love You 1000 Times》是 The Platters 于 2019 年演唱的歌曲。在 520 这个日子里&#xff0c;拼题 A 请你实现一个小功能&#xff0c;把 1000 这个数字换成用户输入的任意一个数字&#xff0c;然后仿照歌名的句式输出表白…