code: func (consumer *Consumer) MultiGet(length int) ([]*Package, error) {
  	var collection []*Package
  	if consumer.HasUnacked() {
  		return nil, fmt.Errorf("unacked Packages found")
  	}
  
  	// TODO maybe use transactions for rollback in case of errors?
  	reqs, err := consumer.Queue.redisClient.Pipelined(func(c *redis.Pipeline) error {
  		c.BRPopLPush(
  			queueInputKey(consumer.Queue.Name),
  			consumerWorkingQueueKey(consumer.Queue.Name, consumer.Name),
  			0,
  		)
  		for i := 1; i < length; i++ {
  			c.RPopLPush(
  				queueInputKey(consumer.Queue.Name),
  				consumerWorkingQueueKey(consumer.Queue.Name, consumer.Name),
  			)
  		}
  		return nil
  	})
  	if err != nil && err != redis.Nil {
  		return nil, err
  	}
  
  	for _, answer := range reqs {
  		switch answer := answer.(type) {
  		case *redis.StringCmd:
  			if answer.Val() == "" {
  				continue
  			}
  			p, err := consumer.parseRedisAnswer(answer)
  			if err != nil {
  				return nil, err
  			}
  			p.Collection = &collection
  			collection = append(collection, p)
  		default:
  			return nil, err
  		}
  	}
  	consumer.Queue.incrRate(
  		consumerWorkingRateKey(consumer.Queue.Name, consumer.Name),
  		int64(length),
  	)
  
  	return collection, nil
  }
docs: // MultiGet returns an array of packages from the queue