c语言编程笔录

首页 >   > 笔记大全

笔记大全

golang线程写法

更新时间:2023-10-30

前言

在Go语言中,线程是以`goroutine`的形式存在的。`goroutine`是一种轻量级的线程,由Go语言的调度器进行调度。Go语言的并发模型使用`goroutine`和通信机制`channel`来实现。通过`goroutine`,可以以一种简单且高效的方式并发地执行多个任务。在本文中,我们将重点介绍如何在Go语言中使用`goroutine`实现线程。

使用goroutine实现线程

Go语言中的`goroutine`可以通过使用`go`关键字来创建。下面是使用`goroutine`实现并发的示例代码:
package main

import (
	"fmt"
	"time"
)

func printNumbers() {
	for i := 0; i < 10; i++ {
		fmt.Println(i)
		time.Sleep(1 * time.Second) // 模拟耗时操作
	}
}

func printLetters() {
	for i := 'A'; i < 'J'; i++ {
		fmt.Printf("%c\n", i)
		time.Sleep(1 * time.Second) // 模拟耗时操作
	}
}

func main() {
	go printNumbers() // 创建一个goroutine并发执行printNumbers函数
	go printLetters() // 创建一个goroutine并发执行printLetters函数

	// 主goroutine继续执行其他的操作
	// 这里可以加入一些其他任务,同时也可以用time.Sleep()等方式等待其他goroutine执行完成

	time.Sleep(10 * time.Second) // 等待一段时间,确保其他goroutine执行完成
}
在上面的代码中,我们定义了两个函数`printNumbers`和`printLetters`,分别用来打印数字和字母。使用`go`关键字可以创建一个新的`goroutine`并发地执行这两个函数。主函数`main`会等待一段时间,确保其他`goroutine`的执行完成。

goroutine与线程的区别

在Go语言中,`goroutine`与传统的操作系统线程有一些不同之处。下面是一些`goroutine`与线程的区别: 1. 轻量级:创建一个`goroutine`比创建一个线程开销要小得多。`goroutine`的初始栈大小只有几KB,并且会根据需要自动按需扩展。 2. 高并发:由于`goroutine`的创建开销较小,因此可以创建大量的`goroutine`,从而实现高并发的程序。 3. 内部调度器:Go语言的`goroutine`是由Go语言的调度器进行调度的,而不是由操作系统的线程调度器进行调度。这种内部调度器的设计使得`goroutine`可以在多个线程上运行,充分利用多核处理器的能力。 4. 通信机制:`goroutine`之间可以通过`channel`进行通信,这种通信机制是Go语言提供的一个重要特性。通过`channel`,`goroutine`可以以一种高效且安全的方式进行数据的发送和接收。

总结

在Go语言中,使用`goroutine`可以方便地实现线程并发。通过使用`go`关键字,可以简单地创建一个`goroutine`并发执行函数。与传统的操作系统线程相比,`goroutine`具有轻量级、高并发、内部调度器和通信机制等特点。这使得Go语言成为处理高并发问题的理想选择。在实际的开发中,我们可以使用`goroutine`来并发地执行耗时操作,提高程序的性能和响应速度。同时,我们还可以使用`channel`来实现`goroutine`之间的通信,实现数据共享和同步等功能。