mirror of
https://bitbucket.org/s_l_teichmann/mtsatellite
synced 2024-11-08 03:00:26 +01:00
interleaver: Run producer and consumer in separate go routines.
This commit is contained in:
parent
82be84d449
commit
fc50897d2d
|
@ -49,17 +49,32 @@ func selectKeyEncoder(interleaved bool) common.KeyEncoder {
|
|||
}
|
||||
|
||||
func copyProducerToConsumer(producer BlockProducer, consumer BlockConsumer) (err error) {
|
||||
var block Block
|
||||
i := 0
|
||||
for {
|
||||
if err = producer.Next(&block); err != nil {
|
||||
if err == ErrNoMoreBlocks {
|
||||
err = nil
|
||||
break
|
||||
|
||||
blocks := make(chan *Block)
|
||||
done := make(chan struct{})
|
||||
defer close(done)
|
||||
|
||||
go func() {
|
||||
defer close(blocks)
|
||||
for {
|
||||
block := new(Block)
|
||||
if err = producer.Next(block); err != nil {
|
||||
if err != ErrNoMoreBlocks {
|
||||
log.Printf("Reading failed: %s\n", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
select {
|
||||
case blocks <- block:
|
||||
case <-done:
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
if err = consumer.Consume(&block); err != nil {
|
||||
}()
|
||||
|
||||
i := 0
|
||||
for block := range blocks {
|
||||
if err = consumer.Consume(block); err != nil {
|
||||
return
|
||||
}
|
||||
i++
|
||||
|
|
Loading…
Reference in New Issue
Block a user