>백엔드 개발 >Golang >많은 고루틴이 빠른 파일 쓰기를 차단할 때 Go가 스레드를 거의 생성하지 않는 이유는 무엇입니까?

많은 고루틴이 빠른 파일 쓰기를 차단할 때 Go가 스레드를 거의 생성하지 않는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-16 06:02:11841검색

Why Does Go Create Few Threads When Many Goroutines Block on Fast File Writes?

Go에서 파일 쓰기 차단으로 인해 최소 스레드 생성이 발생하는 이유

Go에서는 고루틴이 호출 차단에 참여할 때 일반적으로 스레드가 생성됩니다. 그러한 작업을 용이하게 합니다. 그러나 파일에 쓰려고 시도하는 동안 여러 고루틴이 차단되면 혼란스러운 관찰이 발생합니다. 수많은 고루틴이 있음에도 불구하고 제한된 수의 스레드가 설정됩니다.

테스트 코드 및 관찰

다음 테스트 스크립트는 이 동작을 보여줍니다.

package main

import (
    "io/ioutil"
    "os"
    "runtime"
    "strconv"
)

func main() {
    runtime.GOMAXPROCS(2)
    data, err := ioutil.ReadFile("./55555.log")
    if err != nil {
        println(err)
        return
    }
    for i := 0; i < 200; i++ {
        go func(n int) {
            for {
                err := ioutil.WriteFile("testxxx"+strconv.Itoa(n), []byte(data), os.ModePerm)
                if err != nil {
                    println(err)
                    break
                }
            }
        }(i)
    }
    select {}
}

아이러니하게도 이 스크립트가 실행되면 다음과 같이 소수의 스레드만 생성됩니다. 명령:

$ cat /proc/9616/status | grep -i thread
Threads:    5

난제 해결

이 동작을 이해하는 열쇠는 차단 작업의 특성에 있습니다. 원래 테스트에서는 파일 쓰기가 너무 빨리 완료되어 새 스레드 생성이 실행되지 않았습니다.

이를 설명하기 위해 훨씬 더 큰 데이터 블록을 작성하도록 테스트 스크립트가 수정되었습니다.

package main

import (
    "io/ioutil"
    "os"
    "runtime"
    "strconv"
)

func main() {
    runtime.GOMAXPROCS(2)
    data := make([]byte, 128*1024*1024)
    for i := 0; i < 200; i++ {
        go func(n int) {
            for {
                err := ioutil.WriteFile("testxxx"+strconv.Itoa(n), []byte(data), os.ModePerm)
                if err != nil {
                    println(err)
                    break
                }
            }
        }(i)
    }
    select {}
}

이러한 수정으로 인해 200개 이상의 스레드가 생성되었습니다. 명령:

$ cat /proc/17033/status | grep -i thread
Threads:    203

결론

따라서 파일 쓰기 작업이 빠르게 수행되면 호출의 차단 특성이 여러 생성을 트리거하기에 충분하지 않을 수 있습니다. 스레드. 차단 작업이 더욱 중요해져야 추가 스레드에 대한 필요성이 명백해지고 결과적으로 예상대로 스레드가 급증하게 됩니다.

위 내용은 많은 고루틴이 빠른 파일 쓰기를 차단할 때 Go가 스레드를 거의 생성하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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