go语言学习笔记 — 进阶 — 并发编程:为函数创建goroutine

Posted Locutus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 进阶 — 并发编程:为函数创建goroutine相关的知识,希望对你有一定的参考价值。

使用go关键字为一个函数创建一个goroutine。函数与goroutine是一对多的关系,即可以为一个函数创建多个goroutine,一个goroutine必定只对应一个函数。

为普通函数创建goroutine

  • 格式

为一个go函数创建goroutine,写法如下:

go 函数名( 参数列表 ) 

其中,函数名是要调用创建goroutine的funcName;参数列表是函数入参。使用go关键字创建goroutine时,函数的返回值会被忽略。

注:如果想要在goroutine中返回数据,我们需要使用通道channel,把数据从goroutine中作为返回值传出。

  • 例子

命令行不断输出tick n,同时可以接收用户输入,两个操作同时进行。

package main

import (
	"fmt"
	"time"
)

func running() {
	var times int
	for {                         // 构建一个无限循环
		times++
		fmt.Println("tick", times) // 输出times变量的值

		time.Sleep(time.Second)    // time.Sleep延时1秒,之后继续循环
	}
}

func main() {
	go running()                 // 使running()函数和main()函数并发执行

	var input string
	fmt.Scanln(&input)          // 接收用户输入,直到按回车键把命令行输入内容写入input变量
	fmt.Println(input)          // 输出input内容
}

/*
在go语言中,runtime运行时会默认为main()函数创建一个goroutine。

在本例中,main()函数的goroutine创建运行后,执行到go running()时,go调度系统又为running()函数
函数创建了一个goroutine,running()函数在自己的goroutine中运行。

此时通过go语言的调度机制,程序有两个goroutine同时运行。
*/



为匿名函数创建goroutine

  • 格式

使用匿名函数或闭包创建goroutine时,需要定义函数、参数列表、函数列表、入参列表。

go func(参数列表) {
    函数体
}(入参列表)
  • 例子

在main()函数中创建一个匿名函数,并为匿名函数启动goroutine。

package main

import (
    "fmt"
    "time"
)


func main() {
    go func() {                        // 使running()函数和main()函数并发执行
        var times int
    
        for {                          // 构建一个无限循环
            times++ 
            fmt.Println("tick", times) // 输出times变量的值

            time.Sleep(time.Second)    // time.Sleep延时1秒,之后继续循环
        }
    }()

    var input string
    fmt.Scanln(&input)          // 接收用户输入,直到按回车键把命令行输入内容写入input变量
    fmt.Println(input)          // 输出input内容
}

所有goroutine都会在main()结束时,一同结束。goroutine类似于线程,但从调度性能上没有线程细致。细致程度取决于goroutine调度器的实现和运行环境。终止goroutine的最好方法是自然返回goroutine对应的函数。虽然可以用 golang.org/x/net/context 包进行goroutine生命周期控制,但此法处于内测阶段。现在还没有办法获取goroutine的ID。

以上是关于go语言学习笔记 — 进阶 — 并发编程:为函数创建goroutine的主要内容,如果未能解决你的问题,请参考以下文章

go语言学习笔记 — 进阶 — 并发编程:通道(channel) —— 在多个goroutine之间通信的管道

go语言学习笔记 — 进阶 — 并发编程:通道(channel)—— 使用channel收发数据

go语言学习笔记 — 进阶 — 并发编程:go语言的协程goroutine,与普通程序的协程coroutine

go语言学习笔记 — 进阶 — 并发编程:轻量级线程goroutine —— 并发与并行

go语言学习笔记 — 进阶 — 并发编程:通道(channel) —— 各种各样的通道

go语言学习笔记 — 进阶 — 并发编程:同步sync,竞态检测 —— 检测代码在并发环境下出现的问题