Go에는 함수와 고루틴 사이에 부모-자식 관계가 있습니다. 부모 고루틴은 자식 고루틴을 생성하며, 자식 고루틴은 부모 고루틴의 변수에 액세스할 수 있지만 그 반대는 아닙니다. go 키워드를 사용하여 하위 고루틴을 생성합니다. 하위 고루틴은 익명 함수 또는 명명된 함수를 통해 실행됩니다. 상위 고루틴은 모든 하위 고루틴이 완료되기 전에 프로그램이 종료되지 않도록 하기 위해 sync.WaitGroup을 통해 하위 고루틴이 완료될 때까지 기다릴 수 있습니다.
Go 언어에서 고루틴은 동시에 실행되는 함수입니다. 고루틴은 부모-자식 관계로 구성되며, 부모 고루틴은 자식 고루틴을 생성합니다. 자식 고루틴은 부모 고루틴의 변수에 접근할 수 있지만, 부모 고루틴은 자식 고루틴의 변수에 접근할 수 없습니다.
go
키워드를 사용하여 하위 고루틴을 만듭니다. go
关键字创建一个子 goroutine:
go func() { // 子 goroutine 代码 }
子 goroutine 执行匿名函数。同样,我们可以将命名的函数传递给 go
关键字:
func child() { // 子 goroutine 代码 } go child()
子 goroutine 可以访问父 goroutine 的局部变量,而无需显式传递。这是因为 goroutine 在同一内存空间中执行。例如:
func parent() { count := 10 go func() { fmt.Println(count) // 输出 10 }() }
子 goroutine 可以安全地访问和修改父 goroutine 的变量。但是,由于并发,必须使用锁或其他同步机制来防止数据竞争。
父 goroutine 可以使用 sync.WaitGroup
等待子 goroutine 完成。WaitGroup
跟踪剩余子 goroutine 的数量,并提供 Add
和 Wait
方法:
func parent() { var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() // 子 goroutine 代码 }() wg.Wait() // 等待子 goroutine 完成 }
考虑一个并行文件下载器,从多个远程 URL 下载文件。我们可以使用 goroutines 来并发下载,如下所示:
func main() { var wg sync.WaitGroup urls := []string{"url1", "url2", "url3"} for _, url := range urls { wg.Add(1) go func(url string) { defer wg.Done() downloadFile(url) }(url) } wg.Wait() // 等待所有文件下载完成 }
在这个案例中,主 goroutine 创建子 goroutine 来下载每个文件。主 goroutine 使用 WaitGroup
rrreee
go
키워드에 전달할 수 있습니다. sync.WaitGroup
을 사용하여 자식 고루틴이 완료될 때까지 기다릴 수 있습니다. WaitGroup
은 남은 하위 고루틴 수를 추적하고 Add
및 Wait
메소드를 제공합니다. 🎜rrreee🎜실용 사례: 파일 다운로드기🎜🎜병렬 파일 고려 다운로더, 여러 원격 URL에서 파일을 다운로드하세요. 아래와 같이 동시 다운로드를 위해 고루틴을 사용할 수 있습니다: 🎜rrreee🎜 이 경우, 메인 고루틴은 각 파일을 다운로드하기 위해 하위 고루틴을 생성합니다. 기본 고루틴은 WaitGroup
을 사용하여 모든 하위 고루틴이 완료될 때까지 기다리며 모든 파일이 다운로드되기 전에 프로그램이 종료되지 않도록 합니다. 🎜🎜결론🎜🎜함수와 고루틴 간의 부모-자식 관계를 이해하는 것은 강력한 병렬 Go 프로그램을 구축하는 데 중요합니다. 변수 액세스와 고루틴 동기화 메커니즘을 이해함으로써 고성능 동시 애플리케이션을 만들 수 있습니다. 🎜위 내용은 golang 함수와 goroutine 간의 부모-자식 관계의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!