'Returns a iterator equivalent to `map(fn, iter)`.
Parameters
fn
A callable that will take take as many arguments as there are
passed iterables.
timeout
The maximum number of seconds to wait. If None, then there
is no limit on the wait time.
Returns
An iterator equivalent to: `map(func, *iterables)` but the calls may
be evaluated out-of-order.
Raises
TimeoutError
If the entire result iterator could not be generated
before the given timeout.
Exception
If `fn(*args)` raises for any values.'

def map(self, fn, *iterables, **kwargs):

    timeout = kwargs.get('timeout')
    if (timeout is not None):
        end_time = (timeout + time.time())
    fs = [self.submit(fn, *args) for args in zip(*iterables)]
    try:
        for future in fs:
            if (timeout is None):
                (yield future.result())
            else:
                (yield future.result((end_time - time.time())))
    finally:
        for future in fs:
            future.cancel()
