def METHOD_NAME(func, args=None, kwargs=None, workers=None, callback=None):
    """
    Execute task within pool of processes
    :param func:        callable function to execute
    :param args:        list of arg lists for each function execution
    :param kwargs:      list of kwarg dicts for each function execution
    :param workers:     number of workers processes to use
    :param callback:    callable function to execute after each completion
    :return:            list of running tasks
    """
    with ProcessPoolExecutor(max_workers=workers) as executor:
        # no args or kwargs, number of tasks = num workers
        if args is None and kwargs is None:
            workers = workers if workers is not None else 1
            if callback:
                tasks = [executor.submit(func).add_done_callback(callback) for _ in range(workers)]
            else:
                tasks = [executor.submit(func) for _ in range(workers)]
        # args without kwargs
        elif kwargs is None:
            if callback:
                tasks = [executor.submit(func, *func_args).add_done_callback(callback) for func_args in args]
            else:
                tasks = [executor.submit(func, *func_args) for func_args in args]
        # args and kwargs
        else:
            if callback:
                tasks = [executor.submit(func, *func_args, **func_kwargs).add_done_callback(callback) for func_args, func_kwargs in zip(args, kwargs)]
            else:
                tasks = [executor.submit(func, *func_args, **func_kwargs) for func_args, func_kwargs in zip(args, kwargs)]
    return tasks