반응형
고 루틴 내부의 fmt.Println이 행을 인쇄하지 않는 이유는 무엇입니까?
다음 코드가 있습니다.
package main
import "net"
import "fmt"
import "bufio"
func main() {
conn, _ := net.Dial("tcp", "irc.freenode.net:6667")
reader := bufio.NewReader(conn)
go func() {
str, err := reader.ReadString('\n')
if err != nil {
// handle it
fmt.Println(err)
}
fmt.Println(str)
}()
}
고 루틴의 버퍼에서 읽는 코드가 없으면 다음과 같은 메시지를 출력합니다.
:zelazny.freenode.net NOTICE * :*** Looking up your hostname...
그러나 고 루틴 안에 넣는 것은 아무것도 인쇄하지 않습니다.
누군가 그 이유를 설명 할 수 있습니까?
main()
기능이 완료 되면 프로그램이 종료됩니다 . 이것은 고 루틴이 출력을 실행하고 인쇄 할 시간을 갖기 전에 발생할 가능성이 높습니다.
한 가지 옵션은 메인 고 루틴 블록이 채널에서 읽도록하고 작업이 완료되면 고 루틴이 채널에 쓰도록하는 것입니다.
"는 goroutines 종료에 대한 대기"또 다른 일반적인 방법은, 사용 WaitGroup
: http://golang.org/pkg/sync/#WaitGroup . waitGroup.Add(1)
시작된 waitGroup.Done()
각 고 루틴에 대해 사용 하고 완료 한 후 각 고 루틴에서 사용할 수 있습니다 . 주 함수에서 사용할 수 있으며 추가 된 각 고 루틴에 대해이 호출 waitGroup.Wait()
될 때까지 대기 waitGroup.Done()
합니다.
고 ch
루틴이 끝날 때 채널 에 데이터를 쓰고 고 루틴 ch
외부 에서 데이터를 읽으면 메인 기능이 고 루틴 인쇄 메시지를 기다리게 할 수 있습니다.
다음은 그 예입니다.
package main
import "net"
import "fmt"
import "bufio"
func main() {
conn, _ := net.Dial("tcp", "irc.freenode.net:6667")
reader := bufio.NewReader(conn)
ch := make(chan byte, 1)
go func() {
str, err := reader.ReadString('\n')
if err != nil {
// handle it
fmt.Println(err)
}
fmt.Println(str)
ch <- 1
}()
<-ch
}
다음과 같은 시간 지연을 추가해야합니다 time.Sleep(3 * time.Second)
(3 초 대기).
프로그램이 종료되면 고 루틴이 닫힙니다. 나는 똑같은 문제가 있었다.
반응형
'programing tip' 카테고리의 다른 글
케이스 클래스 상속에 대해 * 그렇게 * 잘못된 것은 무엇입니까? (0) | 2020.11.15 |
---|---|
강제 "가로"방향 모드 (0) | 2020.11.15 |
CSS를 사용하여 색상을 반전하려면 어떻게해야합니까? (0) | 2020.11.15 |
Python에서 형식 문자열 및 명명 된 인수 (0) | 2020.11.15 |
언제 FormGroup과 FormArray를 사용합니까? (0) | 2020.11.15 |