golang并发编程之协程

本文介绍了Golang中的并发特性,通过Goroutines实现函数的并发执行。示例展示了无Goroutines时的串行执行、使用Goroutines后的并发执行以及主协程如何通过WaitGroup等待其他协程完成再继续执行。内容包括Goroutines的创建、主协程与子协程的关系以及同步机制的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Golang 中的并发是函数相互独立运行的能力。Goroutines 是并发运行的函数。Golang 提供了 Goroutines 作为并发处理操作的一种方式。

创建一个协程非常简单,就是在一个任务函数前面添加一个go关键字:

go task()

1.没有Goroutines时,程序是由上往下串行,代码实例

package main

import (
	"fmt"
	"time"
)

func show(msg string) {
	for i := 0; i < 5; i++ {
		fmt.Printf("msg: %v\n", msg)
		time.Sleep(time.Millisecond * 100)
	}
}

func main() {
	show("php")
	show("golang")
	fmt.Println("end...")
}

运行结果

msg: php
msg: php
msg: php
msg: php
msg: php
msg: golang
msg: golang
msg: golang
msg: golang
msg: golang
end...

2.当使用Goroutines时,并发执行 (主协程和其他协程并发执行)

package main

import (
	"fmt"
	"time"
)

func show(msg string) {
	for i := 0; i < 5; i++ {
		fmt.Printf("msg: %v\n", msg)
		time.Sleep(time.Millisecond * 100)
	}
}

func main() {
	go show("php") //协程1
	show("golang")
	fmt.Println("end...") //都有的主协程,主协程和协程1并发执行
}

运行结果

msg: golang
msg: php
msg: php
msg: golang
msg: golang
msg: php
msg: php
msg: golang
msg: php
msg: golang
end...

3.当主协程结束后,其他协程也会终止

package main

import (
	"fmt"
	"time"
)

func show(msg string) {
	for i := 0; i < 5; i++ {
		fmt.Printf("msg: %v\n", msg)
		time.Sleep(time.Millisecond * 100)
	}
}

func main() {
	go show("php")    //协程1
	go show("golang") //协程2

	fmt.Println("end...") //主协程执行的时间短,结束后协程1和协程2也终止
}

运行结果

end...
msg: golang

4.WaitGroup实现同步(主协程等待其他协程完成后再往下执行)

package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

func show(msg string) {
	defer wg.Done() //goroutine结束就登记-1 也可用 wg.Add(-1)
	for i := 0; i < 5; i++ {
		fmt.Printf("msg: %v\n", msg)
		time.Sleep(time.Millisecond * 100)
	}
}

func main() {
	wg.Add(1)      //启动一个goroutine就登记+1
	go show("php") //协程1
	wg.Add(1)
	go show("golang") //协程2

	wg.Wait()             //等待所有登记的goroutine都结束
	fmt.Println("end...") //结束后,主协程继续执行
}

运行结果

msg: php
msg: golang
msg: golang
msg: php
msg: php
msg: golang
msg: golang
msg: php
msg: php
msg: golang
end...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值