The reader's close method will call on_connection_closed, and if nsqlookupd address not set, it will try to reconnect to nsqd after 15 seconds, which means the reader can't be closed in this case?
# in _on_connection_close()
if not self.lookupd_http_addresses:
# automatically reconnect to nsqd addresses when not using lookupd
logger.info('[%s:%s] attempting to reconnect in 15s', conn.id, self.name)
reconnect_callback = functools.partial(self.connect_to_nsqd,
host=conn.host, port=conn.port)
self.io_loop.add_timeout(time.time() + 15, reconnect_callback)