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