Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Go中压缩来自读取器的数据_Go_Gzip - Fatal编程技术网

在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

我用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, 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