Gen
Gen[edit]
Elixir programming language logo
Gen is a module in the Elixir programming language that is used for building generic servers. It provides a framework for designing and implementing stateful and concurrent systems.
Overview[edit]
The Gen module is part of the Elixir standard library and offers a set of functions and macros for creating generic servers. A generic server is a process that maintains state and responds to messages sent by other processes. This pattern is commonly used for implementing servers, supervisors, and event buses.
Key Concepts[edit]
The Gen module introduces several key concepts for building generic servers:
- `GenServer`: A behavior that provides a callback API for defining server behavior, including handling requests, managing state, and handling errors.
- `start`: A function for starting a new GenServer process.
- `call`: A synchronous function for sending a request message to a GenServer and waiting for a response.
- `cast`: An asynchronous function for sending a non-blocking request message to a GenServer.
- `handle_call`: A callback function that defines how a GenServer handles incoming synchronous requests.
- `handle_cast`: A callback function that defines how a GenServer handles incoming asynchronous requests.
- `handle_info`: A callback function that defines how a GenServer handles incoming non-request messages.
- `init`: A callback function that initializes a GenServer's state.
Usage[edit]
To use the Gen module, you will typically define a module for your server, implementing the `GenServer` behavior. This includes defining the callbacks for handling requests, initializing the state, and handling non-request messages. You can then start a new instance of your server using the `start` function.
Below is an example of a simple GenServer that maintains a counter:
```elixir defmodule CounterServer do
use GenServer
def start_link do GenServer.start_link(__MODULE__, 0) end
def handle_call(:get_count, _from, state) do {:reply, state, state} end
def handle_cast(:increment, state) do {:noreply, state + 1} end
end
{:ok, pid} = CounterServer.start_link GenServer.call(pid, :get_count) #=> 0 GenServer.cast(pid, :increment) GenServer.call(pid, :get_count) #=> 1 ```