如何等待Goroutine完成执行?

的WaitGroup类型 同步 软件包,用于等待程序完成从主函数启动的所有goroutine。它使用一个指定goroutine数量的计数器,并且Wait阻止程序执行,直到WaitGroup计数器为零。

方法用于将计数器添加到WaitGroup。

完成了 使用defer语句来调度WaitGroup方法以减少WaitGroup计数器。

等待 等待Group类型的方法等待程序完成所有goroutine。

在主函数内部调用Wait方法,该函数将阻止执行,直到WaitGroup计数器的值为零为止,并确保所有goroutine都已执行。

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"同步"
)

// 等待Group is used to wait for the program to finish goroutines.
var wg 同步.WaitGroup

func responseSize(url string) {
	// Schedule the call to 等待Group's 完成了 to tell goroutine is completed.
	defer wg.Done()

	fmt.Println("Step1: ", url)
	response, err := http.Get(url)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("Step2: ", url)
	defer response.Body.Close()

	fmt.Println("Step3: ", url)
	body, err := ioutil.ReadAll(response.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Step4: ", len(body))
}

func main() {
	// 加 a count of three, one for each goroutine.
	wg.Add(3)
	fmt.Println("Start Goroutines")

	go responseSize("//www.yfmac.net")
	go responseSize("//stackoverflow.com")
	go responseSize("//coderwall.com")

	// 等待 for the goroutines to finish.
	wg.Wait()
	fmt.Println("Terminating Program")
}

运行上面的程序时,您可能会看到以下输出:


C:\彩票中心下载\goroutines\create-simple-goroutine>go run main.go
Start Goroutines
Step1:  //coderwall.com
Step1:  //www.golangprograms.com
Step1:  //stackoverflow.com
Step2:  //stackoverflow.com
Step3:  //stackoverflow.com
Step4:  116749
Step2:  //www.golangprograms.com
Step3:  //www.golangprograms.com
Step4:  79801
Step2:  //coderwall.com
Step3:  //coderwall.com
Step4:  203842
Terminating Program

您必须阅读的解决方案

如何在彩票中心下载中使用原子函数解决竞争条件?

争用条件是由于对共享资源的不同步访问而引起的,并试图同时读取和写入该资源。 原子函数提供了用于同步访问整数和指针的低级锁定机制。原子功能通常用于修复竞争条件。 同步包下的atomic中的函数通过锁定对共享资源的访问来提供支持同步goroutine的支持。

如何杀死goroutine的执行?

通道具有关闭通道的关闭操作,因此无法在通道上进行发送操作。在关闭的通道上进行发送操作将导致恐慌。 在通道上执行接收操作时,我们检查通道是否关闭,如果通道关闭,则从goroutine退出。

如何在彩票中心下载中创建goroutine?

在每次调用函数responseSize之前添加了go关键字。三个responseSize goroutine程序同时启动,并且同时进行了三个对http.Get的调用。该程序不会等到一个响应返回后才发出下一个请求。结果,使用goroutines可以更快地打印出三种响应大小。

如何使用互斥锁定义代码的关键部分并解决竞争条件?

互斥锁用于在代码周围创建关键部分,以确保一次只能有一个goroutine可以执行该代码部分。

如何播放和暂停执行goroutine?

使用通道,我们可以播放和暂停执行goroutine。通道通过充当goroutine之间的管道来处理此通信。

从Goroutines捕获值

从goroutine中获取值的最自然的方法是通道。通道是连接并发goroutine的管道。您可以将值从一个goroutine发送到通道,然后将这些值接收到另一个goroutine或在同步函数中。

What is goroutines?

高朗中的并发是功能彼此独立运行的能力。 Goroutine是可以同时运行的函数。 高朗提供Goroutines作为并发处理操作的一种方式。 新的goroutines由go语句创建。 要将函数作为goroutine运行,请调用以go语句为前缀的函数。这是示例代码块: sum()//一个正常的函数调用,它会同步执行sum并等待其完成 go sum()//一个goroutine,它异步执行sum而不等待完成它 go关键字使函数调用立即返回,而该函数作为goroutine开始在后台运行,而程序的其余部分继续执行。每个彩票中心下载程序的主要功能都是使用goroutine启动的,因此每个彩票中心下载程序至少运行一个goroutine。