>  기사  >  백엔드 개발  >  golang 함수와 goroutine 간의 부모-자식 관계

golang 함수와 goroutine 간의 부모-자식 관계

WBOY
WBOY원래의
2024-04-25 12:57:02406검색

Go에는 함수와 고루틴 사이에 부모-자식 관계가 있습니다. 부모 고루틴은 자식 고루틴을 생성하며, 자식 고루틴은 부모 고루틴의 변수에 액세스할 수 있지만 그 반대는 아닙니다. go 키워드를 사용하여 하위 고루틴을 생성합니다. 하위 고루틴은 익명 함수 또는 명명된 함수를 통해 실행됩니다. 상위 고루틴은 모든 하위 고루틴이 완료되기 전에 프로그램이 종료되지 않도록 하기 위해 sync.WaitGroup을 통해 하위 고루틴이 완료될 때까지 기다릴 수 있습니다.

golang 함수와 goroutine 간의 부모-자식 관계

Go 언어 함수와 고루틴의 부모-자식 관계

Go 언어에서 고루틴은 동시에 실행되는 함수입니다. 고루틴은 부모-자식 관계로 구성되며, 부모 고루틴은 자식 고루틴을 생성합니다. 자식 고루틴은 부모 고루틴의 변수에 접근할 수 있지만, 부모 고루틴은 자식 고루틴의 변수에 접근할 수 없습니다.

하위 고루틴 만들기

go 키워드를 사용하여 하위 고루틴을 만듭니다. go 关键字创建一个子 goroutine:

go func() {
  // 子 goroutine 代码
}

子 goroutine 执行匿名函数。同样,我们可以将命名的函数传递给 go 关键字:

func child() {
  // 子 goroutine 代码
}

go child()

访问父 goroutine 变量

子 goroutine 可以访问父 goroutine 的局部变量,而无需显式传递。这是因为 goroutine 在同一内存空间中执行。例如:

func parent() {
  count := 10
  go func() {
    fmt.Println(count) // 输出 10
  }()
}

子 goroutine 可以安全地访问和修改父 goroutine 的变量。但是,由于并发,必须使用锁或其他同步机制来防止数据竞争。

父 goroutine 等待子 goroutine

父 goroutine 可以使用 sync.WaitGroup 等待子 goroutine 完成。WaitGroup 跟踪剩余子 goroutine 的数量,并提供 AddWait 方法:

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 使用 WaitGrouprrreee

하위 고루틴은 익명 함수를 실행합니다. 마찬가지로 명명된 함수를 go 키워드에 전달할 수 있습니다.

rrreee

상위 고루틴 변수에 액세스

하위 고루틴은 명시적인 전달 없이 상위 고루틴의 지역 변수에 액세스할 수 있습니다. 이는 고루틴이 동일한 메모리 공간에서 실행되기 때문입니다. 예: 🎜rrreee🎜 하위 고루틴은 상위 고루틴의 변수에 안전하게 액세스하고 수정할 수 있습니다. 그러나 동시성으로 인해 데이터 경합을 방지하려면 잠금 또는 기타 동기화 메커니즘을 사용해야 합니다. 🎜🎜부모 고루틴은 자식 고루틴을 기다립니다🎜🎜부모 고루틴은 sync.WaitGroup을 사용하여 자식 고루틴이 완료될 때까지 기다릴 수 있습니다. WaitGroup은 남은 하위 고루틴 수를 추적하고 AddWait 메소드를 제공합니다. 🎜rrreee🎜실용 사례: 파일 다운로드기🎜🎜병렬 파일 고려 다운로더, 여러 원격 URL에서 파일을 다운로드하세요. 아래와 같이 동시 다운로드를 위해 고루틴을 사용할 수 있습니다: 🎜rrreee🎜 이 경우, 메인 고루틴은 각 파일을 다운로드하기 위해 하위 고루틴을 생성합니다. 기본 고루틴은 WaitGroup을 사용하여 모든 하위 고루틴이 완료될 때까지 기다리며 모든 파일이 다운로드되기 전에 프로그램이 종료되지 않도록 합니다. 🎜🎜결론🎜🎜함수와 고루틴 간의 부모-자식 관계를 이해하는 것은 강력한 병렬 Go 프로그램을 구축하는 데 중요합니다. 변수 액세스와 고루틴 동기화 메커니즘을 이해함으로써 고성능 동시 애플리케이션을 만들 수 있습니다. 🎜

위 내용은 golang 함수와 goroutine 간의 부모-자식 관계의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.