进阶|青训营笔记

41 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天 第一部分: Go语言线程和协程

Go语言中提供了两种并发模型: 线程和协程。线程和普通语言中的线程类似,是操作系统分配资源的最小单位。而协程是Go语言特有的概念,它是由Go语言运行时管理的轻量级线程。

示例代码:

Copy code
package main

import (
    "fmt"
    "time"
)

func main() {
    // 创建一个线程
    go func() {
        fmt.Println("Hello from a new thread!")
    }()
    // 创建一个协程
    go func() {
        fmt.Println("Hello from a new goroutine!")
    }()
    // 等待线程和协程结束
    time.Sleep(time.Second)
}

第二部分: Go语言协程之间的通信

在Go语言中,协程之间通过channel进行通信。channel是Go语言中的一种数据类型,可以用来在协程之间传递数据。

示例代码:

Copy code
package main

import "fmt"

func main() {
    // 创建一个channel
    message := make(chan string)
    // 启动一个协程, 将消息发送到channel
    go func() {
        message <- "Hello from a goroutine!"
    }()
    // 从channel中接收消息
    fmt.Println(<-message)
}

第三部分: Go语言Channel通道:生产消费问题

在Go语言中,channel可以用来实现生产者-消费者模型。生产者协程向channel中写入数据,而消费者

继续

协程从channel中读取数据。

示例代码:

Copy code
package main

import "fmt"

func main() {
    // 创建一个channel
    messages := make(chan string)
    // 启动生产者协程
    go func() {
        for i := 0; i < 5; i++ {
            messages <- fmt.Sprintf("message %d", i)
        }
        close(messages)
    }()
    // 启动消费者协程
    for message := range messages {
        fmt.Println(message)
    }
}

第四部分: 并发安全Lock

在Go语言中,可以使用sync.Mutex来实现对共享资源的并发安全访问。

示例代码:

Copy code
package main

import (
    "fmt"
    "sync"
)

var counter int
var lock sync.Mutex

func main() {
    // 启动3个协程
    var wg sync.WaitGroup
    wg.Add(3)
    go func() {
        defer wg.Done()
        for i := 0; i < 100; i++ {
            lock.Lock()
            counter++
            lock.Unlock()
        }
    }()
    go func() {
        defer wg.Done()
        for i := 0; i < 100; i++ {
            lock.Lock()
            counter++
            lock.Unlock()
        }
    }()
    go func() {
        defer wg.Done()
        for i := 0; i < 100; i++ {
            lock.Lock()
            counter++
            lock.Unlock()
        }
    }()
    wg.Wait()
    fmt.Println(counter)
}

第五部分: WaitGroup实现并发任务的同步

在Go语言中,可以使用sync.WaitGroup来实现对多个并发任务的同步。

示例代码:

Copy code
package main

import (
    "fmt"
    "sync"
)

func main() {
    // 创建WaitGroup
    var wg sync.WaitGroup
    // 添加2个任务
    wg.Add(2)
    // 启动任务1
    go func() {
        defer wg.Done()
        fmt.Println("Task 1 is done!")
    }()
    // 启动任务2
    go func() {
    defer wg.Done() fmt.Println("Task 2 is done!") }() // 等待所有任务完成 wg.Wait() fmt.Println("All tasks are done!") }




第六部分: Goroutine、Channel、Syncoroutine、Channel、Sync是Go语言中三个重要的概念, 分别用于实现并发、通信和同步。

Goroutine是Go语言中轻量级线程, 可以用来实现并发执行任务。

Channel是Go语言中的一种数据类型, 可以用来在Goroutine之间传递数据。

Sync是Go语言中的同步库, 包含了多种工具, 如Mutex, WaitGroup等, 用于实现对共享资源的并发安全访问和对多个并发任务的同步。

总之, Goroutine、Channel、Sync是Go语言中三个重要的概念, 分别用于实现并发、通信和同步。