📜  高朗 | Goroutine vs 线程(1)

📅  最后修改于: 2023-12-03 14:58:51.204000             🧑  作者: Mango

Goroutine vs 线程

简介

在编程语言中,一般有两种方式来使程序并发执行:线程(Thread)和协程(Coroutine)。

线程

线程是程序的基本执行单元,是操作系统中任务调度的最小单位。线程是由内核来调度执行,需要进行上下文切换,因此创建和销毁线程的开销较大。

同时,由于线程是共享进程内存空间的,线程之间的通信需要加锁保证数据的一致性,这也增加了一定的复杂度。

协程

协程是一种轻量级线程,也被称为 goroutine。协程是用户空间中的任务调度的最小单位,不需要内核的调度和上下文切换,因此创建和销毁协程的开销比线程小得多。

另外,协程之间的通信可以通过 channel 来完成,避免了加锁的麻烦和性能损耗。协程还支持函数的闭包特性,可以访问外部变量,使得代码更加简洁易懂。

示例

下面是一个简单的示例,比较了线程和协程的执行效果:

package main

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

func threadFunc() {
	for i := 0; i < 5; i++ {
		fmt.Println("Thread: ", i)
		time.Sleep(1 * time.Second)
	}
}

func coroutineFunc() {
	for i := 0; i < 5; i++ {
		fmt.Println("Coroutine: ", i)
		time.Sleep(1 * time.Second)
	}
}

func main() {
	var wg sync.WaitGroup

	wg.Add(1)
	go func() {
		defer wg.Done()
		threadFunc()
	}()

	wg.Add(1)
	go func() {
		defer wg.Done()
		coroutineFunc()
	}()

	wg.Wait()
}

运行结果如下:

Coroutine:  0
Thread:  0
Coroutine:  1
Thread:  1
Coroutine:  2
Thread:  2
Coroutine:  3
Thread:  3
Coroutine:  4
Thread:  4

从结果可以看出,协程与线程所打印的输出是交替出现的,但是协程的执行时间明显要短。

总结

协程是一种轻量级的并发执行方式,相比于线程具有以下优势:

  • 创建和销毁的开销小得多。
  • 不需要内核的调度和上下文切换,执行效率更高。
  • 支持函数的闭包特性,代码更加简洁易懂。
  • 通信方式简单,通过 channel 即可实现。

因此,在 Golang 中,建议使用协程来实现程序的并发执行。