这是我参与「第五届青训营 」伴学笔记创作活动的第 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语言中三个重要的概念, 分别用于实现并发、通信和同步。