golang怎样开多个线程
在Go语言中,可使用goroutine来实现多线程的并发履行。goroutine是Go语言中轻量级的线程,可以在一个程序中创建很多个goroutine,并且它们之间的切换和调度是由Go语言的运行时自动完成的。
要创建一个新的goroutine,只需要在函数或方法调用前加上关键字go便可。例如:
package main
import (
"fmt"
"time"
)
func main() {
// 创建一个新的goroutine
go printNumbers()
// 主goroutine继续履行其他任务
for i := 0; i < 5; i++ {
fmt.Println("Main goroutine:", i)
time.Sleep(time.Second)
}
}
func printNumbers() {
for i := 0; i < 5; i++ {
fmt.Println("New goroutine:", i)
time.Sleep(time.Second)
}
}
在上面的例子中,我们使用go printNumbers()
创建了一个新的goroutine来履行printNumbers
函数。主goroutine继续履行for
循环中的任务,而新的goroutine会并发地履行printNumbers
函数中的任务。
需要注意的是,主goroutine在结束之前不会等待其他goroutine的完成,所以在上面的例子中,主goroutine和新的goroutine会并发地履行,打印出来的数字是交替出现的。
另外,还可使用sync.WaitGroup
来等待所有的goroutine都履行终了。例如:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
// 创建两个新的goroutine
wg.Add(2)
go printNumbers(&wg)
go printLetters(&wg)
// 等待所有的goroutine履行终了
wg.Wait()
}
func printNumbers(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 5; i++ {
fmt.Println("Numbers:", i)
time.Sleep(time.Second)
}
}
func printLetters(wg *sync.WaitGroup) {
defer wg.Done()
for i := 'A'; i < 'E'; i++ {
fmt.Println("Letters:", string(i))
time.Sleep(time.Second)
}
}
在上面的例子中,我们使用sync.WaitGroup
来等待所有的goroutine履行终了。首先在main
函数中创建了一个WaitGroup
实例,并且调用了Add
方法来指定需要等待的goroutine的数量。然后在每一个goroutine的函数中,都调用了wg.Done()
来表示当前goroutine履行终了。最后,在main
函数中调用wg.Wait()
来等待所有的goroutine完成。
通过以上两种方式,就能够在Go语言中开启多个goroutine来实现多线程的并发履行。
TOP