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

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

Susan Sarandon
풀어 주다: 2024-12-16 06:02:11
원래의
849명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿