>백엔드 개발 >Golang >golang 함수가 goroutine과 통신하는 방법

golang 함수가 goroutine과 통신하는 방법

PHPz
PHPz원래의
2024-04-26 09:36:02972검색

함수와 고루틴은 다음과 같은 방법으로 통신할 수 있습니다: 뮤텍스 잠금: 공유 리소스를 보호하는 데 사용 조건 변수: 조건을 충족하는 고루틴을 알리는 데 사용 채널: 데이터 전송 버퍼 원자 변수: 잠금 없는 동시 액세스 변수 실제 사례: 병렬 처리 작업 고루틴을 사용하면 작업 생성, 고루틴 처리 작업 시작, 처리 결과 수집의 세 단계로 구성된 컴퓨팅 집약적인 작업의 실행 효율성을 높일 수 있습니다.

golang 함수가 goroutine과 통신하는 방법

Go 언어에서 함수와 고루틴 간의 통신 방법

Go 언어에서 함수와 고루틴은 다음과 같은 방식으로 통신할 수 있습니다.

1 Mutex(Mutex)

Mutex 잠금은 공유 리소스를 보호하고 동시에 하나의 고루틴만 리소스에 액세스할 수 있도록 합니다.

var mu sync.Mutex // 全局互斥锁

func increment(i *int) {
    mu.Lock()
    *i++
    mu.Unlock()
}

2. 조건 변수(Cond)

조건 변수는 지정된 조건이 충족될 때 대기 중인 고루틴에 알리는 데 사용됩니다.

var cond sync.Cond // 全局条件变量

func wait(c *sync.Cond, i *int) {
    c.L.Lock()
    for {
        if *i == 0 {
            c.Wait()
        }
        break
    }
    c.L.Unlock()
}

3. 채널

채널은 고루틴 간에 데이터를 전송하는 데 사용되는 버퍼입니다.

var ch = make(chan int, 10) // 创建容量为 10 的通道

func send(c chan int, i int) {
    c <- i // 发送数据
}

func receive(c chan int) {
    v := <-c // 接收数据
}

4. 원자 변수

원자 변수는 잠금 없이 동시에 액세스할 수 있습니다.

var atomicInt int64

func incrementAtomic(i *int64) {
    atomicInt++
}

실용 사례: 병렬 처리 작업

다음은 고루틴을 사용하여 작업을 병렬로 처리하는 실제 사례입니다.

// 任务类型
type Task struct {
    Num  int
    Chan chan int
}

func processTask(t *Task) {
    // 处理任务并返回结果
    result := t.Num * t.Num
    t.Chan <- result
}

func createTasks(n int) []*Task {
    // 创建 n 个任务
    tasks := make([]*Task, n)
    for i := 0; i < n; i++ {
        tasks[i] = &Task{
            Num:  i,
            Chan: make(chan int),
        }
    }
    return tasks
}

func main() {
    n := 10
    tasks := createTasks(n)

    // 启动 n 个 Goroutine 并行处理任务
    for _, t := range tasks {
        go processTask(t)
    }

    // 从任务中收集处理结果
    results := make([]int, n)
    for i := 0; i < n; i++ {
        results[i] = <-tasks[i].Chan
    }

    // 打印结果
    for _, r := range results {
        fmt.Println(r)
    }
}

고루틴을 사용하여 작업을 병렬로 처리하면 프로그램의 실행 효율성이 크게 향상될 수 있습니다. 특히 계산 집약적인 작업.

위 내용은 golang 함수가 goroutine과 통신하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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