View Source Finitomata.Throttler (Finitomata v0.29.0)

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

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

Functions

Synchronously executes the function, using throttling based on GenStage.

Returns a specification to start this module under a supervisor.

Starts the throttler with the underlying producer-consumer stages.

Types

t()

@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

throttlee()

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

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.

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}.

child_spec(init_arg)

Returns a specification to start this module under a supervisor.

See Supervisor.

start_link(opts)

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