我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Go语言中goroutine怎么创建

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Go语言中goroutine怎么创建

这篇“Go语言中goroutine怎么创建”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言中goroutine怎么创建”文章吧。

goroutine是Go语言中的轻量级线程实现,是建立在线程之上的轻量级的抽象,由Go运行时(runtime)管理。goroutine允许我们以非常低的代价在同一个地址空间中并行地执行多个函数或者方法;相比于线程,它的创建和销毁的代价要小很多,并且它的调度是独立于线程的。

在编写 Socket 网络程序时,需要提前准备一个线程池为每一个 Socket 的收发包分配一个线程。开发人员需要在线程数量和 CPU 数量间建立一个对应关系,以保证每个任务能及时地被分配到 CPU 上进行处理,同时避免多个任务频繁地在线程间切换执行而损失效率。

虽然,线程池为逻辑编写者提供了线程分配的抽象机制。但是,如果面对随时随地可能发生的并发和线程处理需求,线程池就不是非常直观和方便了。能否有一种机制:使用者分配足够多的任务,系统能自动帮助使用者把任务分配到 CPU 上,让这些任务尽量并发运作。这种机制在 Go语言中被称为 goroutine。

goroutine 是 Go语言中的轻量级线程实现,由 Go 运行时(runtime)管理。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。

Goroutine是建立在线程之上的轻量级的抽象。它允许我们以非常低的代价在同一个地址空间中并行地执行多个函数或者方法。相比于线程,它的创建和销毁的代价要小很多,并且它的调度是独立于线程的。

Go 程序从 main 包的 main() 函数开始,在程序启动时,Go 程序就会为 main() 函数创建一个默认的 goroutine。

使用普通函数创建 goroutine

Go 程序中使用 go 关键字为一个函数创建一个 goroutine。一个函数可以被创建多个 goroutine,一个 goroutine 必定对应一个函数。

1) 格式

为一个普通函数创建 goroutine 的写法如下:

go 函数名( 参数列表 )

  • 函数名:要调用的函数名。

  • 参数列表:调用函数需要传入的参数。

使用 go 关键字创建 goroutine 时,被调用函数的返回值会被忽略。

如果需要在 goroutine 中返回数据,请使用后面介绍的通道(channel)特性,通过通道把数据从 goroutine 中作为返回值传出。

2) 例子

使用 go 关键字,将 running() 函数并发执行,每隔一秒打印一次计数器,而 main 的 goroutine 则等待用户输入,两个行为可以同时进行。请参考下面代码:

package mainimport (    "fmt"    "time")func running() {    var times int    // 构建一个无限循环    for {        times++        fmt.Println("tick", times)        // 延时1秒        time.Sleep(time.Second)    }}func main() {    // 并发执行程序    go running()    // 接受命令行输入, 不做任何事情    var input string    fmt.Scanln(&input)}

命令行输出如下:

Go语言中goroutine怎么创建

代码执行后,命令行会不断地输出 tick,同时可以使用 fmt.Scanln() 接受用户输入。两个环节可以同时进行。

代码说明如下:

  • 第 12 行,使用 for 形成一个无限循环。

  • 第 13 行,times 变量在循环中不断自增。

  • 第 14 行,输出 times 变量的值。

  • 第 17 行,使用 time.Sleep 暂停 1 秒后继续循环。

  • 第 25 行,使用 go 关键字让 running() 函数并发运行。

  • 第 29 行,接受用户输入,直到按 Enter 键时将输入的内容写入 input 变量中并返回,整个程序终止。

这段代码的执行顺序如下图所示。

Go语言中goroutine怎么创建
图:并发运行图

这个例子中,Go 程序在启动时,运行时(runtime)会默认为 main() 函数创建一个 goroutine。在 main() 函数的 goroutine 中执行到 go running 语句时,归属于 running() 函数的 goroutine 被创建,running() 函数开始在自己的 goroutine 中执行。此时,main() 继续执行,两个 goroutine 通过 Go 程序的调度机制同时运作。

使用匿名函数创建goroutine

go 关键字后也可以为匿名函数或闭包启动 goroutine。

1) 使用匿名函数创建goroutine的格式

使用匿名函数或闭包创建 goroutine 时,除了将函数定义部分写在 go 的后面之外,还需要加上匿名函数的调用参数,格式如下:

go func( 参数列表 ){    函数体}( 调用参数列表 )

其中:

  • 参数列表:函数体内的参数变量列表。

  • 函数体:匿名函数的代码。

  • 调用参数列表:启动 goroutine 时,需要向匿名函数传递的调用参数。

2) 使用匿名函数创建goroutine的例子

在 main() 函数中创建一个匿名函数并为匿名函数启动 goroutine。匿名函数没有参数。代码将并行执行定时打印计数的效果。参见下面的代码:

package mainimport (    "fmt"    "time")func main() {    go func() {        var times int        for {            times++            fmt.Println("tick", times)            time.Sleep(time.Second)        }    }()    var input string    fmt.Scanln(&input)}

代码说明如下:

  • 第 10 行,go 后面接匿名函数启动 goroutine。

  • 第 12~19 行的逻辑与前面程序的 running() 函数一致。

  • 第 21 行的括号的功能是调用匿名函数的参数列表。由于第 10 行的匿名函数没有参数,因此第 21 行的参数列表也是空的。

扩展知识:Goroutine与线程的区别

许多人认为goroutine比线程运行得更快,这是一个误解。Goroutine并不会更快,它只是增加了更多的并发性。当一个goroutine被阻塞(比如等待IO),golang的scheduler会调度其他可以执行的goroutine运行。与线程相比,它有以下的几个优点:

内存消耗更少:

Goroutine所需要的内存通常只有2kb,而线程则需要1Mb(500倍)

创建与销毁的开销更小:

由于线程创建时需要向操作系统申请资源,并且在销毁时将资源归还,因此它的创建和销毁的开销比较大。相比之下,goroutine的创建和销毁是由go语言在运行时自己管理的,因此开销更低。

切换开销更小:

只是goroutine之于线程的主要区别,也是golang能够实现高并发的主要原因。线程的调度方式是抢占式的,如果一个线程的执行时间超过了分配给它的时间片,就会被其他可执行的线程抢占。在线程切换的过程中需要保存/恢复所有的寄存器信息,比如16个通用寄存器,PC(Program Counter)、SP(Stack Pointer)段寄存器等等。而goroutine的调度是协同式的,它不会直接地与操作系统内核打交道。当goroutine进行切换的时候,之后很少量的寄存器需要保存和恢复(PC和SP)。因此goroutine的切换效率更高。

以上就是关于“Go语言中goroutine怎么创建”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Go语言中goroutine怎么创建

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Go语言中goroutine怎么创建

这篇“Go语言中goroutine怎么创建”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言中goroutine怎么创建
2023-07-04

Go语言中的Goroutine和channel怎么使用

这篇“Go语言中的Goroutine和channel怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言中的Gor
2023-07-05

如何在 Go 中创建优先级 Goroutine?

在 go 语言中创建优先级 goroutine 有两步:注册自定义 goroutine 创建函数(步骤 1)并指定优先级值(步骤 2)。这样,您可以创建不同优先级的 goroutine,优化资源分配并提高执行效率。如何创建优先级 Gorou
如何在 Go 中创建优先级 Goroutine?
2024-05-15

Golang中怎么创建和管理goroutine

在Golang中,可以使用关键字go来创建一个goroutine。一个goroutine是一个轻量级的线程,它可以并发执行代码。下面是一个简单的例子,展示如何创建一个goroutine:package mainimport ("fmt"
Golang中怎么创建和管理goroutine
2024-03-13

go语言中怎么使用goroutine实现并行请求

本篇内容介绍了“go语言中怎么使用goroutine实现并行请求”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,让我们来看一下如何使用
2023-07-05

Go语言中goroutine和WaitGroup如何使用

本篇内容主要讲解“Go语言中goroutine和WaitGroup如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言中goroutine和WaitGroup如何使用”吧!Go语言中g
2023-07-05

Go调度器学习之goroutine调度怎么创建

今天小编给大家分享一下Go调度器学习之goroutine调度怎么创建的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 协程
2023-07-05

R语言中怎么创建数据框

要创建一个数据框(data frame)可以使用以下方法:使用data.frame()函数:# 创建一个包含姓名和年龄的数据框df <- data.frame(Name = c("Alice", "Bob", "Charlie"),Age
R语言中怎么创建数据框
2024-03-02

如何在 Go 中创建一个共享内存的 Goroutine?

可以通过 channel 实现共享内存的 goroutine:创建一个 channel 以指定元素类型。启动一个 goroutine 向 channel 写入数据。在主 goroutine 中使用 range 循环从 channel 读取数
如何在 Go 中创建一个共享内存的 Goroutine?
2024-05-16

Go语言中goroutine和WaitGroup的使用示例详解

goroutine是Go中一个轻量级的线程,只需要一个go关键字就可以创建一个goroutine,这篇文章主要介绍了Go语言中goroutine和WaitGroup的使用,需要的朋友可以参考下
2023-03-03

R语言怎么创建矩阵

本篇内容主要讲解“R语言创建矩阵怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“R语言创建矩阵怎么实现”吧!矩阵向量vector用于描述一维数据,是R语言中最基础的数据结构形式矩阵matr
2023-06-08

Go语言如何创建 XML 解析器

这篇文章详细介绍了如何在Go语言中创建XML解析器。它提供了分步说明,包括导入必要包、定义结构体、使用xml.Decoder逐行解析XML、使用xml.Marshal将数据编组为XML。还提供了代码示例,演示如何解析和编组XML。文中还提供了附加提示,以增强解析功能。
Go语言如何创建 XML 解析器
2024-04-02

如何使用Go语言创建路由

如何使用Go语言创建路由,需要具体代码示例在Go语言中,路由是Web开发中非常重要的一部分。它用于将HTTP请求映射到具体的处理函数,实现不同请求的处理和路由的管理。本文将介绍如何使用Go语言创建路由,并给出具体的代码示例。首先,我们需要导
如何使用Go语言创建路由
2023-12-18

C语言中怎么使用mfc创建项目

要在C语言中使用MFC(Microsoft Foundation Class)创建项目,需要按照以下步骤进行:打开Visual Studio,选择“新建项目”。在创建新项目的向导中,选择“Visual C++” -> “MFC”。选择“
C语言中怎么使用mfc创建项目
2024-02-29

如何在Go语言中创建一个必要的包

如何在Go语言中创建一个必要的包在Go语言中,包是组织代码的基本单元,它可以包含多个相关的函数、变量和类型定义。创建一个必要的包是每个Go语言程序员都需要掌握的基本技能。本文将演示如何在Go语言中创建一个必要的包,并提供具体的代码示例。
如何在Go语言中创建一个必要的包
2024-03-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录