golang中goroutine

1. 概念

goroutine 奉行通过通信来共享内存,而不是共享内存来通信

goroutine 是由go的运行时(runtime)调度和管理的
go程序会智能的将goroutine中的任务合理的分配给CPU执行

go语言之所以会被称为现代化编程语言,是因为它在语言层面已经内置了调度和上下文切换的机制

在go语言编程中你不需要自己去写进程、线程、协程,当你需要让某个任务并发执行的时候,
你只需要把这个任务包装成一个函数,开启一个goroutine去执行这个函数就可以了。

一个goroutine必须对应一个函数,可以创建多个goroutine去执行相同的函数

 

2. goroutine实现同步

package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup

func main() {


	for i := 0; i < 10; i++ {
		wg.Add(1)
		go hello(i)
	}

	// 此处使用sync.WaitGroup来实现goroutine的同步
	wg.Wait()

	// 多次执行代码,发现打印的顺序不一致,因为10个goroutine是并发执行的,而goroutine的调度是随机的

}

func hello(i int) {
	defer wg.Done()
	fmt.Println("goroutine", i)
}

  

3.  子goroutine是依赖于主goroutine的,主goroutine一旦结束,子goroutine立马结束

package main

import (
	"fmt"
	"time"
)

func main() {
	// 合起来写
	go func() {
		i := 0
		for {
			i++
			fmt.Printf("new goroutine: i = %d\n", i)
			time.Sleep(time.Second)
		}
	}()
	i := 0
	for {
		i++
		fmt.Printf("main goroutine: i = %d\n", i)
		time.Sleep(time.Second)
		if i == 2 {
			break
		}
	}
}

  

posted @ 2021-11-04 11:15  专职  阅读(105)  评论(0编辑  收藏  举报