函数和 Goroutine 之间可以通过以下方式通信:互斥锁:用于保护共享资源条件变量:用于通知满足条件的 goroutine通道:数据传输缓冲区原子变量:无锁并发访问变量实战案例:并行
函数和 Goroutine 之间可以通过以下方式通信:互斥锁:用于保护共享资源条件变量:用于通知满足条件的 goroutine通道:数据传输缓冲区原子变量:无锁并发访问变量实战案例:并行处理任务,通过 goroutine 提高计算密集型任务的执行效率,具体包括创建任务、启动 goroutine 处理任务、收集处理结果三个步骤。
Go 语言中函数和 Goroutine 之间的通信方式
在 Go 语言中,函数和 Goroutine 可以通过以下几种方式进行通信:
1. 互斥锁(Mutex)
互斥锁用于保护共享资源,确保同一时间只有一个 Goroutine 能够访问该资源。
var mu sync.Mutex // 全局互斥锁
func increment(i *int) {
mu.Lock()
*i++
mu.Unlock()
}
2. 条件变量(Cond)
条件变量用于在指定条件满足时通知等待的 Goroutine。
var cond sync.Cond // 全局条件变量
func wait(c *sync.Cond, i *int) {
c.L.Lock()
for {
if *i == 0 {
c.Wait()
}
break
}
c.L.Unlock()
}
3. 通道(Channel)
通道是一个用来在 Goroutine 之间发送数据的缓冲区。
var ch = make(chan int, 10) // 创建容量为 10 的通道
func send(c chan int, i int) {
c <- i // 发送数据
}
func receive(c chan int) {
v := <-c // 接收数据
}
4. 原子变量
原子变量可以在没有锁的情况下进行并发访问。
var atomicInt int64
func incrementAtomic(i *int64) {
atomicInt++
}
实战案例:并行处理任务
下面是一个使用 Goroutine 并行处理任务的实战案例:
// 任务类型
type Task struct {
Num int
Chan chan int
}
func processTask(t *Task) {
// 处理任务并返回结果
result := t.Num * t.Num
t.Chan <- result
}
func createTasks(n int) []*Task {
// 创建 n 个任务
tasks := make([]*Task, n)
for i := 0; i < n; i++ {
tasks[i] = &Task{
Num: i,
Chan: make(chan int),
}
}
return tasks
}
func main() {
n := 10
tasks := createTasks(n)
// 启动 n 个 Goroutine 并行处理任务
for _, t := range tasks {
go processTask(t)
}
// 从任务中收集处理结果
results := make([]int, n)
for i := 0; i < n; i++ {
results[i] = <-tasks[i].Chan
}
// 打印结果
for _, r := range results {
fmt.Println(r)
}
}
使用 Goroutine 并行处理任务可以显著提高程序的执行效率,特别是对于计算密集型任务。
--结束END--
本文标题: golang函数与goroutine的通信方式
本文链接: https://lsjlt.com/news/609264.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0