def _do_private_mode(FetcherClass, services, kwargs, random_wait_seconds, verbose=False, timeout=None):
    addresses = kwargs.pop('addresses')
    results = {}

    with futures.ThreadPoolExecutor(max_workers=len(addresses)) as executor:
        fetches = {}
        for address in addresses:
            k = kwargs
            k['address'] = address
            random.shuffle(services)
            srv = FetcherClass(
                services=services, verbose=verbose, timeout=timeout,
                random_wait_seconds=random_wait_seconds
            )
            # address is returned because balance needs to be returned
            # attached to the address. Other methods (get_transaction, unspent_outputs, etc)
            # do not need the address again.
            fetches[executor.submit(srv.action, **k)] = (srv, address)

        to_iterate = futures.as_completed(fetches)

        for future in to_iterate:
            service, address = fetches[future]
            results[address] = future.result()

    return results
Private mode is only applicable to address_balance, unspent_outputs, and
dataset/ETHPy150Open priestc/moneywagon/moneywagon/core.py/_do_private_mode