Go 语言进阶与依赖管理 (一)day3| 青训营

113 阅读3分钟

今天学习Go语言进阶与依赖管理。

Go并发编程

1. 并发与并行:

  • 并发: 并发是在一个程序中同时执行多个任务的能力。
  • 并行: 并行是在同一时刻执行多个任务的能力
    以下为Go语言的并发与并行的概念和用法:
  1. Go协程(goroutine)
    Go协程(goroutine):Go语言通过轻量级的用户态线程——协程(goroutine)来实现并发。使用关键字go可以创建一个协程,使其在后台运行,从而能够同时执行多个任务。相比系统线程,协程的创建和销毁代价较低,并且调度器能够在协程之间进行高效切换。
import (
    "fmt"
    "time"
)

func worker(num int) {
    for i := 0; i < 5; i++ {
        fmt.Printf("Worker %d: %0; i < 10; i++ {
        go worker(i)
    }
    // 等待所有协程执行完毕
    time.Sleep(time.Second * 10)
    fmt.Println("Main: End")
}

这个程序使用了go关键字来创建协程。每个协程都执行相同的函数worker,但是它们各自的num参数不同。在主函数中,使用一个循环创建了10个协程,并使用time.Sleep函数等待10秒钟,以确保所有协程都有时间执行完毕。

2. CSP和通道(channel)

Go语言的CSP(Communicating Sequential Processes)是一种并发编程模型,它描述了两个独立的并发实体通过共享的通信通道进行通信的并发模型。 在CSP中,通信通道被称为channel,它是第一类对象,即可以像变量一样传递和操作。实体通过向channel发送消息来通信,也可以从channel接收消息。 CSP模型的关键是关注channel,而不关注发送消息的实体。在Go语言中,goroutine对应CSP中的并发实体,而channel则对应CSP中的channel。

package main
import (
	"fmt"
)
func producer(ch chan<- int) {
	for i := 0; i < 5; i++ {
		ch <- i // 将i发送到通道ch
	}
	close(ch) // 关闭通道ch
}
func consumer(ch <-chan int) {
	for num := range ch {
		fmt.Println(num) // 从通道ch接收数据并打印
	}
}
func main() {
	ch := make(chan int) // 创建一个整型通道

	go producer(ch) // 启动生产者协程,向通道发送数据
	consumer(ch)    // 在主协程中作为消费者,从通道接收数据
}

在这个例子中,定义了两个函数producer()和consumer(),分别作为生产者和消费者协程。producer()函数通过将0到4的整数发送到通道ch,然后关闭通道。consumer()函数从通道ch接收数据,并打印到控制台。 在main函数中,创建了一个整型通道ch,然后通过使用go关键字启动一个生产者协程producer(ch)和一个消费者协程consumer(ch)。这样,生产者和消费者协程可以并发执行,通过通道进行数据的同步和交互。运行该程序,0到4的整数被顺序打印出来。

总结

学习Go语言协程和CSP的过程中,个人总结感悟如下:
协程是一种轻量级的并发模型,它允许我们在Go语言中轻松地创建并发的任务,这些任务可以在同一个线程内并发执行。CSP模型则提供了一种更为抽象和高级的并发模型,它允许我们通过通道(channel)在不同的协程之间进行通信,从而实现更加灵活和高效的并发编程。学习Go协程和CSP不仅让我掌握了并发编程的技能,还让我更加深入地理解了Go语言的特性和设计思想。Go语言的设计者们通过精心设计的并发模型和通道机制,让我们能够更加轻松和高效地编写并发程序,这也正是Go语言在云计算和分布式系统领域得到广泛应用的原因之一。学习Go协程和CSP让我对并发编程有了更加深入的理解和认识,我将会继续学习和探索并发编程的领域。