func (c *Consumer) Close() (err error) {
	c.closeOnce.Do(func() {
		close(c.dying)
		<-c.dead

		if e := c.release(); e != nil {
			err = e
		}
		if e := c.consumer.Close(); e != nil {
			err = e
		}
		close(c.messages)
		close(c.errors)

		if e := c.leaveGroup(); e != nil {
			err = e
		}
		close(c.partitions)
		close(c.notifications)

		// drain
		for range c.messages {
		}
		for range c.errors {
		}
		for p := range c.partitions {
			_ = p.Close()
		}
		for range c.notifications {
		}

		c.client.release()
		if c.ownClient {
			if e := c.client.Close(); e != nil {
				err = e
			}
		}
	})
	return
}
func (c *Consumer) Close() (err error) {
	c.closeOnce.Do(func() {
		close(c.dying)
		<-c.dead

		if e := c.release(); e != nil {
			err = e
		}
		if e := c.consumer.Close(); e != nil {
			err = e
		}
		close(c.messages)
		close(c.errors)

		if e := c.leaveGroup(); e != nil {
			err = e
		}
		close(c.partitions)
		close(c.notifications)

		
		for range c.messages {
		}
		for range c.errors {
		}
		for p := range c.partitions {
			_ = p.Close()
		}
		for range c.notifications {
		}

		c.client.release()
		if c.ownClient {
			if e := c.client.Close(); e != nil {
				err = e
			}
		}
	})
	return
}
func ( c * Consumer ) Close ( ) ( err error ) { c . closeOnce . Do ( func ( ) { close ( c . dying ) <- c . dead if e := c . release ( ) ; e != nil { err = e } if e := c . consumer . Close ( ) ; e != nil { err = e } close ( c . messages ) close ( c . errors ) if e := c . leaveGroup ( ) ; e != nil { err = e } close ( c . partitions ) close ( c . notifications ) // drain for range c . messages { } for range c . errors { } for p := range c . partitions { _ = p . Close ( ) } for range c . notifications { } c . client . release ( ) if c . ownClient { if e := c . client . Close ( ) ; e != nil { err = e } } } ) return }
// Close safely closes the consumer and releases all resources
Close safely closes the consumer and releases all resources