code: def compare(ctx, commands):
      
      mp_pool = multiprocessing.Pool(multiprocessing.cpu_count() * 2)
      for ip in ctx.obj['hosts']:
          mp_pool.apply_async(wrap.open_connection, args=(ip,
                              ctx.obj['conn']['username'],
                              ctx.obj['conn']['password'],
                              wrap.compare, [commands],
                              ctx.obj['out'],
                              ctx.obj['conn']['connect_timeout'],
                              ctx.obj['conn']['session_timeout'],
                              ctx.obj['conn']['port']), callback=write_out)
      mp_pool.close()
      mp_pool.join()
docs: Run 'show | compare' for set commands.
  
      @param ctx: The click context paramter, for receiving the object dictionary
                | being manipulated by other previous functions. Needed by any
                | function with the @click.pass_context decorator.
      @type ctx: click.Context
      @param commands: The Junos set commands that will be put into a candidate
                     | configuration and used to create the 'show | compare'
                     | against the running configuration. much like the commands
                     | parameter for the commit() function, this can be one of
                     | three things: a string containing a single command, a
                     | string containing a comma separated list of commands, or
                     | a string containing a filepath location for a file with
                     | commands on each line.
      @type commands: str
  
      @returns: None. Functions part of click relating to the command group
              | 'main' do not return anything. Click handles passing context
              | between the functions and maintaing command order and chaining.