c语言编程笔录

首页 >   > 笔记大全

笔记大全

怎么并发golang

更新时间:2023-10-14

并发在Golang中的概念

并发是指同时执行多个独立的任务,而不是指同时在多个处理器上运行任务。在Golang中,使用goroutines和channels可以很方便地实现并发。Goroutine是一种轻量级的线程,它可以在相同的地址空间中执行并与其他goroutines共享内存,而channel是一种通信机制,用于在goroutines之间传递数据。

使用goroutines实现并发

在Golang中,使用关键字go可以创建一个goroutine。创建一个goroutine只需在函数调用前加上go关键字即可。例如,以下代码将创建两个并发的goroutines:

package main

import (
	"fmt"
	"time"
)

func sayHello() {
	for i := 0; i < 5; i++ {
		fmt.Println("Hello")
		time.Sleep(100 * time.Millisecond)
	}
}

func sayWorld() {
	for i := 0; i < 5; i++ {
		fmt.Println("World")
		time.Sleep(100 * time.Millisecond)
	}
}

func main() {
	go sayHello()
	go sayWorld()

	time.Sleep(1 * time.Second)
}

在上面的代码中,sayHello和sayWorld函数会被并发地执行。通过调用time.Sleep让主goroutine等待一段时间,以确保其他goroutines有足够的时间完成。

使用channels进行并发通信

在Golang中,channel是一种用于在goroutines之间进行通信的机制。通过channel,goroutines可以安全地发送和接收数据。

package main

import "fmt"

func sum(numbers []int, result chan int) {
	total := 0
	for _, number := range numbers {
		total += number
	}
	result <- total
}

func main() {
	numbers := []int{1, 2, 3, 4, 5}

	result := make(chan int)
	go sum(numbers[:len(numbers)/2], result)
	go sum(numbers[len(numbers)/2:], result)
	
	// 接收结果
	sum1, sum2 := <-result, <-result
	
	fmt.Println(sum1 + sum2)
}

在上面的代码中,我们创建了一个result channel,用于接收goroutines计算出的结果。通过<-运算符,我们可以发送和接收数据。在主goroutine中,我们将numbers切片分为两部分,并使用两个goroutines并发地计算每部分的总和,然后通过channel将结果发送回主goroutine。

总结

Golang提供了简单而强大的并发机制,使得我们可以轻松地实现并发编程。通过使用goroutines和channels,我们可以实现高效的并发任务,并且避免了传统并发编程中的共享内存竞态条件问题。

使用goroutines可以创建轻量级的线程,而channels则提供了一种安全的通信机制。通过将它们结合使用,我们可以编写出可靠且高效的并发代码。