def process_urls(self, urls, output_dir, completion_func=None,
                     completion_worker_count=-1, completion_extra_prms=None):

        # check input parameters
        if not urls:
            raise ValueError('At least one url must be specified for processing')

        # prepare workers for callback if using callback function
        # returned process will end once all callbacks have been completed
        if completion_func:
            self._callback_handler = CallbackHandler(completion_func,
                                                     len(urls),
                                                     completion_worker_count)

        # launch main URL processor jobs
        jobs = [gevent.spawn(self.process_url,
                             urldata, output_dir,
                             call_completion_func=(completion_func is not None),
                             completion_extra_prms=completion_extra_prms,
                             start_time=time.time())
                for urldata in urls]

        # wait for all URL processor jobs to complete
        gevent.joinall(jobs, timeout=self.timeout)
        log.info('all process_url jobs joined!')

        # if using callbacks, wait for all callbacks to complete before continuing
        if completion_func:
            # detect if timeout occurred by iterating through jobs and using 'get', which
            # will re-raise the Timeout exception for any jobs
            timeout_occurred = False
            for job in jobs:
                try:
                    job.get(block=False)
                except Timeout, IndexError:
                    job.kill(block=True)
                    timeout_occurred = True

            # only wait for callback handler if timeout didn't occur
            # (as timeout will cause uncompleted gevent jobs to be forcibly ended
            #  thus never returning to allow job manager to in turn return)
            if not timeout_occurred:
                self._callback_handler.join()
            else:
                log.info('Timeout occurred when processing jobs')
                self._callback_handler.terminate()

        # construct return list of filenames
        results = []

        for job in jobs:
            if job.value:
                results.append(job.value)

        return results
.. versionadded:: 2015.8.0
dataset/ETHPy150Open kencoken/imsearch-tools/imsearchtools/process/image_getter.py/ImageGetter.process_urls--crossover with--dataset/ETHPy150Open saltstack/salt/salt/modules/portage_config.py/get_iuse