programing tip

고 루틴 내부의 fmt.Println이 행을 인쇄하지 않는 이유는 무엇입니까?

itbloger 2020. 11. 15. 10:59
반응형

고 루틴 내부의 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 초 대기).

프로그램이 종료되면 고 루틴이 닫힙니다. 나는 똑같은 문제가 있었다.

참고URL : https://stackoverflow.com/questions/16228887/why-does-fmt-println-inside-a-goroutine-not-print-a-line

반응형