Search documentation of Finitomata

# View Source Finitomata.Throttler (Finitomata v0.21.2)

The internal definition of the call to throttle.

`Finitomata.Throttler.call/3` is a blocking call similar to `GenServer.call/3`, but served by the underlying `GenStage` producer-consumer pair.

Despite this implementation of throttling based on `GenStage` is provided mostly for internal needs, it is generic enough to use wherever. Use the childspec `{Finitomata.Throttler, name: name, initial: [], max_demand: 3, interval: 1_000}` to start a throttling process and `Finitomata.Throttler.call/3` to perform throttled synchronous calls from different processes.

### Usage

    {:ok, pid} = Finitomata.Throttler.start_link(name: Throttler)

    Finitomata.Throttler.call(Throttler, {IO, :inspect, [42]})
    42

    #⇒ %Finitomata.Throttler{
    #   from: {#PID<0.335.0>, #Reference<0.3154300821.2643722246.59214>},
    #   fun: {IO, :inspect},
    #   args: ~c"*",
    #   result: 42,
    #   duration: 192402,
    #   payload: nil
    # }

# Summary

## Types

t()

The in/out parameter for calls to `Finitomata.Throttler.call/3`

throttlee()

The simplified in parameter for calls to `Finitomata.Throttler.call/3`

## Functions

call(name \\ nil, request, timeout \\ :infinity)

Synchronously executes the function, using throttling based on `GenStage`.

child_spec(init_arg)

Returns a specification to start this module under a supervisor.

start_link(opts)

Starts the throttler with the underlying producer-consumer stages.

# Types

Link to this type

# t()

View Source

    @type t() :: %Finitomata.Throttler{
      from: GenServer.from(),
      fun: (keyword() -> any()),
      args: keyword(),
      result: any(),
      duration: pos_integer(),
      payload: any()
    }

The in/out parameter for calls to `Finitomata.Throttler.call/3`

Link to this type

# throttlee()

View Source

    @type throttlee() :: t() | {(keyword() -> any()), [any()]}

The simplified in parameter for calls to `Finitomata.Throttler.call/3`

# Functions

Link to this function

# call(name \\ nil, request, timeout \\ :infinity)

View Source

Synchronously executes the function, using throttling based on `GenStage`.

This function has a default timeout `:infinity` because of its nature (throttling is supposed to take a while,) but it might be passed as the third argument in a call to `call/3`.

If a list of functions is given, executes all of them in parallel, collects the results, and then returns them to the caller.

The function might be given as `Finitomata.Throttler.t/0` or in a simplified form as `{function_of_arity_1, arg}` or `{mod, fun, args}`.

Link to this function

# child_spec(init_arg)

View Source

Returns a specification to start this module under a supervisor.

See `Supervisor`.

Link to this function

# start_link(opts)

View Source

Starts the throttler with the underlying producer-consumer stages.

Accepted options are:

- `name` the base name for the throttler to be used in calls to `call/3`
- `initial` the initial load of requests (avoid using it unless really needed)
- `max_demand`, `initial` the options to be passed directly to `GenStage`’s consumer