Gen

From Elixir Wiki
Jump to navigation Jump to search

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 ```

Related Articles[edit]

References[edit]