self()}) end #=> PID<0.83.0> receive do {:hello, pid} -> "Got hello from #{inspect pid}" end #=> "Got hello from #PID<0.83.0>" Процессы - изолированные, параллельные, легковесные
с состоянием • GenServer - "generic process", инкапсулирует работу с состоянием, добавляют возможность использовать sync и async методы • GenEvent - позволяет работать с событиями • Task - позволяет запустить процесс, а потом получить его результат
-> IO.inspect(e) end #=> %RuntimeError{message: "Big Bad Error"} try do throw "Big Bad Throwable Error" catch e -> IO.inspect(e) end #=> "Big Bad Throwable Error" А еще все умрет, если умрет связанный (linked) процесс...
do GenServer.start_link(__MODULE__, state, opts) end def handle_call(:pop, _from, [h | t]) do {:reply, h, t} end def handle_cast({:push, h}, t) do {:noreply, [h | t]} end end Наше приложение
Supervisor.Spec # Supervise the Stack server which will be started with # a single argument [:hello] and the default registered # name of MyStack. children = [ worker(Stack, [[:hello], [name: MyStack]]) ] # Start the supervisor with our child {:ok, pid} = Supervisor.start_link(children, strategy: :one_for_one)
do field :city, :string field :temp_lo, :integer field :temp_hi, :integer end def keyword_query do query = from w in Weather, where: w.city == "Moscow" and w.temp_lo > 0, select: w Repo.all(query) end end
to 2 Million Websocket Connections in Phoenix: https:// www.youtube.com/watch?v=c6JcVwbOGXc • Processing 2.7 million images with Elixir: https://www.youtube.com/watch? v=xoNRtWl4fZU • Elixir on the Web: Raising Phoenix: https://www.youtube.com/watch? v=h4z7WnMLXKI • benchee: https://github.com/PragTob/benchee • Phoenix benchmarks: https://github.com/mroth/phoenix-showdown • Код из презентации: https://github.com/sobolevn/fpconf_elixir