modal.Function
class Function(typing.Generic, modal.object.Object)Functions are the basic units of serverless execution on Modal.
Generally, you will not construct a Function directly. Instead, use the App.function() decorator to register your Python functions with your App.
hydrate
hydrate(self, client=None)Synchronize the local object with its identity on the Modal server.
It is rarely necessary to call this method explicitly, as most operations will lazily hydrate when needed. The main use case is when you need to access object metadata, such as its ID.
Added in v0.72.39: This method replaces the deprecated .resolve() method.
update_autoscaler
update_autoscaler(self, *, min_containers=None, max_containers=None,
buffer_containers=None, scaledown_window=None)Override the current autoscaler behavior for this Function.
Unspecified parameters will retain their current value, i.e. either the static value from the function decorator, or an override value from a previous call to this method.
Subsequent deployments of the App containing this Function will reset the autoscaler back to its static configuration.
Parameters
None to leave unchanged. None to leave unchanged. None to leave unchanged. None to leave unchanged. Usage
f = modal.Function.from_name("my-app", "function")
# Always have at least 2 containers running, with an extra buffer when the Function is active
f.update_autoscaler(min_containers=2, buffer_containers=1)
# Limit this Function to avoid spinning up more than 5 containers
f.update_autoscaler(max_containers=5)
# Extend the scaledown window to increase the amount of time that idle containers stay alive
f.update_autoscaler(scaledown_window=300)from_name
from_name(cls, app_name, name, *, version=None, environment_name=None,
client=None)Reference a Function from a deployed App by its name.
This is a lazy method that defers hydrating the local object with metadata from Modal servers until the first time it is actually used.
Parameters
Cls.from_name instead. Client.from_env() when omitted. Returns
A lazy Function handle.
Usage
f = modal.Function.from_name("other-app", "function")The version parameter allows you to invoke a version-pinned function:
f_v3 = modal.Function.from_name("other-app", "function", version=3)get_web_url
get_web_url(self)URL for addressing a Web Function via HTTP.
Returns
The HTTPS URL for the web endpoint, or None if this Function is not a web endpoint.
with_options
with_options(self, *, cpu=None, memory=None, gpu=None, env=None, secrets=None,
volumes={}, retries=None, max_containers=None, buffer_containers=None,
scaledown_window=None, timeout=None, region=None, cloud=None)Dynamically override the static Function configuration with invocation-specific values.
This method returns a new Function instance with the dynamic configuration. Invocations of the new Function will run in a distinct container pool and autoscale independently from the base Function (and from other dynamic configurations).
Note that options cannot be “unset” with this method (i.e., if a GPU is configured in the @app.cls() decorator, passing gpu=None here will not create a CPU-only instance).
Additionally, container arguments like volumes and secrets will replace the base
configuration or any previous use of this method rather than extending it.
Usage:
You can use this method after looking up a deployed Function:
fn = modal.Function.from_name("my_app", "fn").with_options(gpu="H100")
fn.remote() # will run on a H100 GPUOr by referencing another Function defined in the same App:
@app.function()
def fn():
...
# From a local entrypoint or another Function
fn.with_options(gpu="H100").remote() # Uses an H100 GPU
fn.remote() # Uses the static configuration with no GPUwith_concurrency
with_concurrency(self, *, max_inputs, target_inputs=None)Override the static Function configuration with invocation-specific input concurrency.
Returns a new Function instance that is dynamically configured to behave like a Function using
the @modal.concurrent decorator. This instance will autoscale independently from the base Function.
with_batching
with_batching(self, *, max_batch_size, wait_ms)Override the static Function configuration with invocation-specific dynamic batching.
Returns a new Function instance that is dynamically configured to behave like a Function using
the @modal.batched decorator. This instance will autoscale independently from the base Function.
remote
remote(self, *args, **kwargs)Calls the function remotely, executing it with the given arguments and returning the execution’s result.
Parameters
Returns
The value returned by the remote function.
remote_gen
remote_gen(self, *args, **kwargs)Calls the generator remotely, executing it with the given arguments.
Parameters
Returns
Values produced by the remote generator.
local
local(self, *args, **kwargs)Calls the function locally, executing it with the given arguments and returning the execution’s result.
The function will execute in the same environment as the caller, just like calling the underlying function directly in Python. In particular, only secrets available in the caller environment will be available through environment variables.
Parameters
Returns
The return value of the local call (or a coroutine for async functions).
spawn
spawn(self, *args, **kwargs)Calls the function with the given arguments, without waiting for the results.
Conceptually similar to multiprocessing.pool.apply_async, or a Future/Promise in other contexts.
Parameters
Returns
A modal.FunctionCall object
that can later be polled or waited for using .get(timeout=...).
get_raw_f
get_raw_f(self)Return the inner Python object wrapped by this Modal Function.
Returns
The original function object registered with Modal.
get_current_stats
get_current_stats(self)Return a FunctionStats object describing the current function’s queue and runner counts.
Returns
Snapshot counts for backlog, runners, and running inputs.
map
map(self, *input_iterators, kwargs={}, order_outputs=True,
return_exceptions=False, wrap_returned_exceptions=None)Parallel map over a set of inputs.
Pass one iterable per positional argument of the underlying function. Results are yielded as an
iterable (sync) or async iterator (map.aio).
If applied to an @app.function, map() returns one result per input and output order matches
input order by default. Set order_outputs=False to emit results in completion order.
return_exceptions can aggregate failures into the result stream instead of raising.
Parameters
Usage
@app.function()
def my_func(a):
return a ** 2
@app.local_entrypoint()
def main():
assert list(my_func.map([1, 2, 3, 4])) == [1, 4, 9, 16]@app.function()
def my_func(a):
if a == 2:
raise Exception("ohno")
return a ** 2
@app.local_entrypoint()
def main():
print(list(my_func.map(range(3), return_exceptions=True)))starmap
starmap(self, input_iterator, *, kwargs={}, order_outputs=True,
return_exceptions=False, wrap_returned_exceptions=None)Like map, but each input item is unpacked into multiple positional arguments.
Every element of input_iterator should be a sequence (for example a tuple) with length equal to the
arity of the function.
Parameters
Usage
@app.function()
def my_func(a, b):
return a + b
@app.local_entrypoint()
def main():
assert list(my_func.starmap([(1, 2), (3, 4)])) == [3, 7]for_each
for_each(self, *input_iterators, kwargs={}, ignore_exceptions=False)Execute the function for all inputs and wait for completion, discarding return values.
Like .map() but you do not need to iterate the result to drive work—Modal processes every input.
Parameters
spawn_map
spawn_map(self, *input_iterators, kwargs={})Spawn parallel execution over a set of inputs, exiting as soon as the inputs are created (without waiting for the map to complete).
Takes one iterator argument per argument in the function being mapped over.
Programmatic retrieval of results will be supported in a future update.
Parameters
Usage
@app.function()
def my_func(a):
return a ** 2
@app.local_entrypoint()
def main():
my_func.spawn_map([1, 2, 3, 4])