Powered by AppSignal & Oban Pro

Untitled notebook

livebook/server.livemd

Untitled notebook

Section

server process

defmodule DatabaseServer do
  def start do
    spawn(fn ->
      connection = :rand.uniform(1000)
      loop(connection)
    end)
  end

  defp loop(connection) do
    receive do
      {:run_query, from_pid, query_def} ->
        query_result = run_query(connection, query_def)
        send(from_pid, {:query_result, query_result})
    end

    loop(connection)
  end

  defp run_query(connection, query_def) do
    Process.sleep(2000)
    "Connection #{connection}: #{query_def} result"
  end

  def run_async(server_pid, query_def) do
    send(server_pid, {:run_query, self(), query_def})
  end

  def get_result do
    receive do
      {:query_result, result} -> result
    after
      5000 -> {:error, :timeout}
    end
  end
end
pid = DatabaseServer.start()
DatabaseServer.run_async(pid, "message 12")
DatabaseServer.get_result()
pool = Enum.map(1..100, fn _ -> DatabaseServer.start() end)
Enum.each(1..5, fn query_def ->
  server_pid = Enum.at(pool, :rand.uniform(100) - 1)
  DatabaseServer.run_async(server_pid, query_def)
end)
Enum.map(1..5, fn _ -> DatabaseServer.get_result() end)
pool = Enum.map(1..100, fn _ -> DatabaseServer.start() end)
Enum.each(
  1..5,
  fn query_def ->
    server_pid = Enum.at(pool, :rand.uniform(100) - 1)
    DatabaseServer.run_async(server_pid, query_def)
  end
)
Enum.map(1..5, fn _ -> DatabaseServer.get_result() end)