> 백엔드 개발 > Golang > io.쓰기/읽기를 시도할 때 파이프 및 교착 상태

io.쓰기/읽기를 시도할 때 파이프 및 교착 상태

王林
풀어 주다: 2024-02-06 09:40:03
앞으로
1180명이 탐색했습니다.

尝试写入/读取时 io.Pipe 和死锁

질문 내용

기본 논리를 이해하려고 몇 시간을 보냈지만 진전이 없었습니다. 아래 코드는 첫 번째 반복 후 교착 상태를 반환합니다. io.copy 전에 작가를 닫으면 교착 상태는 사라지지만 아무것도 인쇄되지 않습니다(읽기 전에 파이프의 쓰기 끝이 닫혀 있기 때문입니다)

으아아아

코드 실행 후 발생한 오류입니다

func main() {
    reader, writer := io.pipe()
    c := make(chan string)

    go func() {
        for i := 0; i < 5; i++ {
            text := fmt.sprintf("hello %vth time", i+1)
            c <- text
        }

        close(c)
    }()

    for msg := range c {
        msg = fmt.sprintf("\nreceived from channel -> %v\n", msg)

        go fmt.fprint(writer, msg)
        io.copy(os.stdout, reader)
        writer.close()
    }

}
로그인 후 복사

정답


io.copy 不断尝试复制,直到读取器到达 eof(在本例中,当管道关闭时)。由于您在 io.copy 结束后调用 writer.close() after ,因此 io.copy 리더가 eof에 도달할 때까지(이 경우 파이프가 닫힐 때) 계속 복사를 시도하세요.

가 완료된 후 writer.close() 이후를 호출하므로

는 결코 eof를 볼 수 없으며 영원히 정지됩니다. closeable 对象只应关闭一次,并且在 close

코드의 또 다른 문제는 파이프를 여러 번 닫으려고 한다는 것입니다(루프 코드가 반복될 때마다). 일반적으로

d 이후에는 사용할 수 없는 것으로 간주됩니다. 재사용해야 하는 경우 새 인스턴스를 생성해야 합니다.

🎜이것은 코드의 실제 개정판입니다: 🎜 으아아아

위 내용은 io.쓰기/읽기를 시도할 때 파이프 및 교착 상태의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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