FuncX Executor

The FuncXExecutor provides a future based interface that simplifies both function submission and result tracking. The key functionality in the FuncXExecutor is the asynchronous event based result tracking that propagates new results to the user via the use of Futures. This asynchronous behavior is widely used in Python and the FuncXExecutor extends the popular executor interface from the concurrent.futures.Executor library.

Initializing the executor

from funcx import FuncXClient, FuncXExecutor

fx = FuncXExecutor(FuncXClient())

Running functions

...
fx = FuncXExecutor(FuncXClient())

def double(x):
    return x * 2

# The executor.submit method deviates from the concurrent.futures.Executor in that
# you can specify funcX specific attributes such as endpoint_id and container_id
# as keyword args
future = fx.submit(double, x, endpoint_id=endpoint_id)

# the future.done() method can be used to check the status of the function, without blocking
# this will return a Bool indicating whether the task is complete
print("Status : ", future.done())

# the future.result() is a blocking call that waits until the function's result is available
# if the function failed, an exception would be raised
print("Result : ", future.result())

More complex cases

...
fx = FuncXExecutor(FuncXClient(batch_enabled=True))


def double(x):
    return x * 2

# Here's how you'd launch several functions:
futures = []
for i in range(10):
    futures.append(fx.submit(double, i, endpoint_id=endpoint_id))

# Now wait and print each result:
for f in futures:
    print("Result : ", f.result())