在Go中压缩来自读取器的数据
我用Go编写了以下短程序,它试图透明地压缩读取器()中的数据: 当我运行它时,程序挂起:在Go中压缩来自读取器的数据,go,gzip,Go,Gzip,我用Go编写了以下短程序,它试图透明地压缩读取器()中的数据: 当我运行它时,程序挂起: fatal error: all goroutines are asleep - deadlock! goroutine 1 [semacquire]: sync.runtime_notifyListWait(0x1043e6cc, 0x0) /usr/local/go/src/runtime/sema.go:297 +0x140 sync.(*Cond).Wait(0x1043e6c4, 0x1
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [semacquire]:
sync.runtime_notifyListWait(0x1043e6cc, 0x0)
/usr/local/go/src/runtime/sema.go:297 +0x140
sync.(*Cond).Wait(0x1043e6c4, 0x137118)
/usr/local/go/src/sync/cond.go:57 +0xc0
io.(*pipe).write(0x1043e680, 0x1045a055, 0xa, 0xa, 0x0, 0x0, 0x0, 0x101)
/usr/local/go/src/io/pipe.go:90 +0x1a0
io.(*PipeWriter).Write(0x1040c180, 0x1045a055, 0xa, 0xa, 0xe205ef63, 0x34c, 0x0, 0x0)
/usr/local/go/src/io/pipe.go:157 +0x40
compress/gzip.(*Writer).Write(0x1045a000, 0x1040a130, 0xb, 0x10, 0x2c380, 0x7654, 0x1059e0, 0x111480)
/usr/local/go/src/compress/gzip/gzip.go:168 +0x2e0
bytes.(*Reader).WriteTo(0x10440240, 0x190610, 0x1045a000, 0x0, 0xfef64000, 0x10440240, 0x1045a001, 0x190670)
/usr/local/go/src/bytes/reader.go:134 +0xe0
io.copyBuffer(0x190610, 0x1045a000, 0x1905d0, 0x10440240, 0x0, 0x0, 0x0, 0x106620, 0x1045a000, 0x0, ...)
/usr/local/go/src/io/io.go:380 +0x360
io.Copy(0x190610, 0x1045a000, 0x1905d0, 0x10440240, 0x10440240, 0x0, 0x1a47c0, 0x0)
/usr/local/go/src/io/io.go:360 +0x60
main.compress(0x1905d0, 0x10440240, 0x10440240, 0x1040c170, 0x1040a130, 0xb)
/tmp/sandbox403912545/main.go:19 +0x180
main.main()
/tmp/sandbox403912545/main.go:12 +0xe0
导致死锁的原因是什么?压缩读取器数据的最有效方法是什么?您向io.Pipe写入数据,但从未从中读取数据(在并行go例程中),因此出现死锁。以下是文件中的内容: 管道上的读取和写入是一对一匹配的,除非需要多个读取来使用单个写入。也就是说,对PipeWriter的每一次写入都会阻塞,直到它满足了来自PipeReader的一次或多次读取,这些读取会完全消耗写入的数据。数据直接从写入复制到相应的读取(或读取);没有内部缓冲
也许它在抱怨,因为您从未真正读取从
compress()
返回的数据?您的compress
调用最好用gzip.NewWriter(data)
替换。compress
函数中的所有内容都是冗余的。io.Pipe
的使用一开始就很奇怪。也许你应该改为写一个bytes.Buffer
。
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [semacquire]:
sync.runtime_notifyListWait(0x1043e6cc, 0x0)
/usr/local/go/src/runtime/sema.go:297 +0x140
sync.(*Cond).Wait(0x1043e6c4, 0x137118)
/usr/local/go/src/sync/cond.go:57 +0xc0
io.(*pipe).write(0x1043e680, 0x1045a055, 0xa, 0xa, 0x0, 0x0, 0x0, 0x101)
/usr/local/go/src/io/pipe.go:90 +0x1a0
io.(*PipeWriter).Write(0x1040c180, 0x1045a055, 0xa, 0xa, 0xe205ef63, 0x34c, 0x0, 0x0)
/usr/local/go/src/io/pipe.go:157 +0x40
compress/gzip.(*Writer).Write(0x1045a000, 0x1040a130, 0xb, 0x10, 0x2c380, 0x7654, 0x1059e0, 0x111480)
/usr/local/go/src/compress/gzip/gzip.go:168 +0x2e0
bytes.(*Reader).WriteTo(0x10440240, 0x190610, 0x1045a000, 0x0, 0xfef64000, 0x10440240, 0x1045a001, 0x190670)
/usr/local/go/src/bytes/reader.go:134 +0xe0
io.copyBuffer(0x190610, 0x1045a000, 0x1905d0, 0x10440240, 0x0, 0x0, 0x0, 0x106620, 0x1045a000, 0x0, ...)
/usr/local/go/src/io/io.go:380 +0x360
io.Copy(0x190610, 0x1045a000, 0x1905d0, 0x10440240, 0x10440240, 0x0, 0x1a47c0, 0x0)
/usr/local/go/src/io/io.go:360 +0x60
main.compress(0x1905d0, 0x10440240, 0x10440240, 0x1040c170, 0x1040a130, 0xb)
/tmp/sandbox403912545/main.go:19 +0x180
main.main()
/tmp/sandbox403912545/main.go:12 +0xe0