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

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

王林
王林앞으로
2024-02-06 09:40:031121검색

尝试写入/读取时 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으로 문의하시기 바랍니다. 삭제