>백엔드 개발 >Golang >golang 함수는 goroutine과 어떻게 상호 작용합니까?

golang 함수는 goroutine과 어떻게 상호 작용합니까?

WBOY
WBOY원래의
2024-05-04 12:24:02645검색

Go 함수는 채널, 대기 그룹 또는 채널 제어 실행 흐름, 뮤텍스 또는 채널 동기화 작업을 통해 데이터를 전달하여 Goroutine과 상호 작용합니다. 데이터 전달: 채널을 FIFO 대기열로 사용하여 함수에서 코루틴으로 값을 보내고 받습니다. 실행 흐름 제어: 대기 그룹을 사용하여 코루틴이 실행을 완료할 때까지 기다리거나 채널을 사용하여 코루틴에 특정 작업을 수행하도록 알립니다. 동기화 작업: 뮤텍스 또는 채널을 사용하여 동시에 액세스되는 리소스를 동기화하여 한 번에 하나의 코루틴만 리소스에 액세스하도록 합니다.

golang 함수는 goroutine과 어떻게 상호 작용합니까?

Go 기능은 고루틴과 어떻게 상호작용하나요?

Go에서 고루틴은 동시에 실행되는 경량 스레드입니다. 이를 통해 코드를 병렬로 실행할 수 있어 애플리케이션 성능이 향상됩니다. 함수는 코루틴과 상호작용하여 실행 흐름을 제어하고, 데이터를 전달하고, 작업을 동기화할 수 있습니다.

데이터 전달

데이터는 채널을 통해 함수에서 코루틴으로 전달될 수 있습니다. 채널은 코루틴이 함수로부터 값을 받고 보낼 수 있게 해주는 FIFO(선입선출) 대기열입니다. 다음 예에서는 채널 사용 방법을 보여줍니다.

package main

import "fmt"

func sendData(ch chan<- int) {
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch)
}

func receiveData(ch <-chan int) {
    for {
        data, ok := <-ch
        if !ok {
            return
        }
        fmt.Println("Received:", data)
    }
}

func main() {
    ch := make(chan int)
    go sendData(ch)
    receiveData(ch)
}

실행 흐름 제어

대기 그룹 또는 채널을 사용하여 코루틴의 실행 흐름을 제어할 수 있습니다. 대기 그룹을 사용하면 모든 코루틴의 실행이 완료될 때까지 기다릴 수 있으며, 채널을 사용하면 코루틴에 특정 작업을 수행하도록 알릴 수 있습니다. 다음 예에서는 대기 그룹을 사용하는 방법을 보여줍니다.

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func task(i int) {
    fmt.Println("Task", i)
    wg.Done()
}

func main() {
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go task(i)
    }
    wg.Wait()
}

동기화 작업

동시에 액세스되는 리소스는 뮤텍스 또는 채널을 통해 동기화할 수 있습니다. 뮤텍스 뮤텍스를 사용하면 한 번에 하나의 코루틴이 리소스에 액세스할 수 있습니다. 채널을 사용하면 리소스를 사용할 수 있을 때까지 코루틴을 차단할 수 있습니다. 다음 예에서는 뮤텍스를 사용하는 방법을 보여줍니다.

package main

import (
    "fmt"
    "sync"
)

var mutex sync.Mutex

func task(data string) {
    mutex.Lock()
    fmt.Println(data)
    mutex.Unlock()
}

func main() {
    for i := 0; i < 10; i++ {
        go task(fmt.Sprintf("Task %d", i))
    }
}

위 내용은 golang 함수는 goroutine과 어떻게 상호 작용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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