>  기사  >  백엔드 개발  >  Golang의 채널보다 뮤텍스가 느린 이유는 무엇입니까?

Golang의 채널보다 뮤텍스가 느린 이유는 무엇입니까?

王林
王林앞으로
2024-02-09 16:10:18682검색

为什么互斥锁比 golang 中的通道慢?

뮤텍스가 Golang의 채널보다 느린 이유는 무엇입니까? 이는 일반적인 문제이며 많은 개발자가 이 문제의 원인을 조사하고 있습니다. 뮤텍스와 채널은 golang에서 일반적으로 사용되는 동기화 메커니즘이며 동시 프로그래밍에서 중요한 역할을 합니다. 그러나 때때로 뮤텍스 잠금의 성능이 채널보다 좋지 않은 경우가 있습니다. 이유는 무엇입니까? PHP 편집자 Youzi는 독자가 동시 프로그래밍의 성능 차이를 더 잘 이해할 수 있도록 이 기사의 모든 사람에게 이 질문에 답할 것입니다.

질문 내용

웹사이트를 크롤링하고 상태를 반환하는 프로그램을 만들고 있습니다.

저는 이 프로그램을 다른 방식으로 작성했습니다. 첫 번째는 데이터 경합을 제거할 수 있도록 뮤텍스를 사용하여 맵에 대한 동시 쓰기를 방지합니다. 그런 다음 동일한 목적으로 채널을 사용하여 구현했습니다. 하지만 벤치마킹을 해보니 채널을 사용하여 구현하는 것이 뮤텍스를 구현하는 것보다 훨씬 빠르다는 것을 깨달았습니다. 왜 이런 일이 발생하는지 알고 싶습니다. 뮤텍스에 성능이 부족한 이유는 무엇입니까? 뮤텍스에 문제가 있습니까?

벤치마크 결과:

코드

으아악

테스트 코드

package concurrency

import "sync"

type websitechecker func(string) bool
type result struct {
    string
    bool
}

func checkwebsites(wc websitechecker, urls []string) map[string]bool {
    results := make(map[string]bool)
    var wg sync.waitgroup
    var mu sync.mutex
    for _, url := range urls {
        wg.add(1)
        go func(u string) {
            defer wg.done()
            mu.lock()
            results[u] = wc(u)
            mu.unlock()
        }(url)
    }
    wg.wait()
    return results
}

func checkwebsiteschannel(wc websitechecker, urls []string) map[string]bool {
    results := make(map[string]bool)
    resultchannel := make(chan result)
    for _, url := range urls {
        go func(u string) {
            resultchannel <- result{u, wc(u)}
        }(url)
    }
    for i := 0; i < len(urls); i++ {
        r := <-resultchannel
        results[r.string] = r.bool
    }
    return results
}

해결 방법

상호 배타적인 버전의 코드를 사용하면 results 映射,还可以保护 wc (只有在获得锁后才能进行调用,因此您可以有效地序列化调用)。仅当右侧准备好后,发送到 chan 才会锁定通道,因此对 wc에 대한 호출이 동시에 발생할 수 있다는 점을 보호할 수 있을 것 같습니다. 코드가

처럼 보이는지 확인하세요. 으아악

뮤텍스를 사용하면 성능이 더 좋아집니다.

위 내용은 Golang의 채널보다 뮤텍스가 느린 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제