Goroutine和for循环

在一个 for 循环中使用了多个 goroutine 启动多个函数时,这些 goroutine 会并发执行。这意味着它们会同时运行,而不是根据 for 循环的迭代增长先后执行。

package main 

import (
	"fmt"
	"sync"
)

func main (){
	var wg sync.WaitGroup 
	for i:=0; i<20 ;i++{
		wg.Add(1)
		go func (x int){
			defer wg.Done()
			fmt.Print(" ",x)
		}(i)
	}
	fmt.Printf("\n%#v\n",wg)
	wg.Wait()
	fmt.Println("\nThe End!")
}

代码中使用了 sync.WaitGroup 来实现并发的等待一组 goroutine 的结束,并确保在所有 goroutine 执行完成后再继续主线程的执行。下面分析代码的执行过程:
1、创建了一个 sync.WaitGroup 对象 wg 用于管理 goroutine 的并发。
2、在 for 循环中,启动了 20 个 goroutine。对于每个 goroutine,它们都会调用 wg.Add(1) 来增加 wg 的计数器值,表示有一个 goroutine 将会被等待执行完成。
3、在每个 goroutine 中,使用了匿名函数并通过闭包的方式将 i 传递给该函数。这样,每个 goroutine 在执行时,输出了对应的 i 的值,并在结束时通过 wg.Done() 来通知 wg 计数器减少 1,表示该 goroutine 执行完成。
4、在主函数的最后,调用了 wg.Wait(),这会阻塞主线程,直到所有 goroutine 的计数器减为 0,也就是所有 goroutine 都执行了 wg.Done()。
5、最终,当所有的 goroutine 都执行完成并调用了 wg.Done() 后,wg.Wait() 解除阻塞,主线程继续执行,输出 “The End!”。

需要注意的是,由于 goroutine 的执行是并发的,所以输出结果的顺序可能是随机的,每次运行的结果可能不同。这是 goroutine 并发执行的特性所决定的。

另外,输出 wg 的信息时使用了 fmt.Printf(“\n%#v\n”, wg),这会打印出 wg 对象的详细信息,包括内部计数器等字段。不过值得注意的是,sync.WaitGroup 并不是一个复杂的结构体,大部分字段都是未导出的,对于一般的使用场景,通常不需要关心这些内部细节。

当循环中启动多个 goroutine 时,它们的执行顺序是不确定的,取决于调度器的调度策略和每个 goroutine 执行的工作量。调度器会根据实际情况在可用的 CPU 上进行任务切换,从而实现并发执行。

这种并发执行的方式可以显著提高程序的性能,尤其在多核 CPU 上,多个 goroutine 可以并行执行,充分利用 CPU 的计算资源。

需要注意的是,由于 goroutine 的并发执行,可能会导致竞态条件(Race Condition)或其他并发问题。在使用 goroutine 进行并发编程时,必须正确地处理共享资源的同步问题,避免出现数据竞争等bug。可以通过互斥锁(Mutex)、通道(Channel)等机制来保证数据的安全访问。

总结:在 for 循环中使用多个 goroutine 时,它们会并发执行,并不会按照 for 循环的迭代增长先后顺序执行。同时,要注意处理并发带来的潜在问题,保证数据安全

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vSeanere

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值