summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Bracco <href@random.sh>2020-05-13 21:29:48 +0200
committerJordan Bracco <href@random.sh>2020-05-13 22:36:48 +0200
commiteec13a033b9c22d6220a33a74ec9e74402fe7f63 (patch)
tree52fd276a1afc89c7666fa44fa5ff307915586ed8
parentNimblePool implementation WIP (diff)
Pool: format & docnimblepool
-rw-r--r--README.md20
-rw-r--r--lib/gen_magic/pool.ex35
-rw-r--r--test/gen_magic/pool_test.exs3
3 files changed, 44 insertions, 14 deletions
diff --git a/README.md b/README.md
index 30bab53..a182566 100644
--- a/README.md
+++ b/README.md
@@ -101,9 +101,23 @@ Note that in this case we have opted to use a named process.
For concurrency *and* resiliency, you may start the `GenMagic.Pool`. By default, it will start a `GenMagic.Server`
worker per online scheduler:
-```elixir
-iex(1)> GenMagic.Pool.start_link([])
-iex(2)> GenMagic.Pool.perform(GenMagic.Pool, Path.expand("~/.bash_history"))
+You can add a pool in your application supervisor by adding it as a child:
+
+```
+ children =
+ [
+ # ...
+ {GenMagic.Pool, [name: YourApp.GenMagicPool, pool_size: 2]}
+ ]
+
+ opts = [strategy: :one_for_one, name: Pleroma.Supervisor]
+ Supervisor.start_link(children, opts)
+```
+
+And then you can use it with `GenMagic.Pool.perform/2`:
+
+```
+iex(1)> GenMagic.Pool.perform(YourApp.GenMagicPool, Path.expand("~/.bash_history"))
{:ok, [mime_type: "text/plain", encoding: "us-ascii", content: "ASCII text"]}
```
diff --git a/lib/gen_magic/pool.ex b/lib/gen_magic/pool.ex
index 2793f98..f542b30 100644
--- a/lib/gen_magic/pool.ex
+++ b/lib/gen_magic/pool.ex
@@ -1,5 +1,16 @@
defmodule GenMagic.Pool do
@behaviour NimblePool
+ @moduledoc "Pool of `GenMagic.Server`"
+
+ def child_spec(opts) do
+ %{
+ id: __MODULE__,
+ start: {__MODULE__, :start_link, [opts]},
+ type: :worker,
+ restart: :permanent,
+ shutdown: 500
+ }
+ end
def start_link(options, pool_size \\ nil) do
pool_size = pool_size || System.schedulers_online()
@@ -10,18 +21,25 @@ defmodule GenMagic.Pool do
pool_timeout = Keyword.get(opts, :pool_timeout, 5000)
timeout = Keyword.get(opts, :timeout, 5000)
- NimblePool.checkout!(pool, :checkout, fn _, server ->
- {GenMagic.Server.perform(server, path, timeout), server}
- end, pool_timeout)
+ NimblePool.checkout!(
+ pool,
+ :checkout,
+ fn _, server ->
+ {GenMagic.Server.perform(server, path, timeout), server}
+ end,
+ pool_timeout
+ )
end
@impl NimblePool
def init_pool(options) do
- {name, options} = case Keyword.pop(options, :name) do
- {name, options} when is_atom(name) -> {name, options}
- {nil, options} -> {__MODULE__, options}
- {_, options} -> {nil, options}
- end
+ {name, options} =
+ case Keyword.pop(options, :name) do
+ {name, options} when is_atom(name) -> {name, options}
+ {nil, options} -> {__MODULE__, options}
+ {_, options} -> {nil, options}
+ end
+
if name, do: Process.register(self(), name)
{:ok, options}
end
@@ -46,5 +64,4 @@ defmodule GenMagic.Pool do
def terminate_worker(_reason, _worker, state) do
{:ok, state}
end
-
end
diff --git a/test/gen_magic/pool_test.exs b/test/gen_magic/pool_test.exs
index 17c4a9d..b987186 100644
--- a/test/gen_magic/pool_test.exs
+++ b/test/gen_magic/pool_test.exs
@@ -2,7 +2,7 @@ defmodule GenMagic.PoollTest do
use GenMagic.MagicCase
test "pool" do
- {:ok, _} = GenMagic.Pool.start_link([name: TestPool, pool_size: 2])
+ {:ok, _} = GenMagic.Pool.start_link(name: TestPool, pool_size: 2)
assert {:ok, _} = GenMagic.Pool.perform(TestPool, absolute_path("Makefile"))
assert {:ok, _} = GenMagic.Pool.perform(TestPool, absolute_path("Makefile"))
assert {:ok, _} = GenMagic.Pool.perform(TestPool, absolute_path("Makefile"))
@@ -13,5 +13,4 @@ defmodule GenMagic.PoollTest do
assert {:ok, _} = GenMagic.Pool.perform(TestPool, absolute_path("Makefile"))
assert {:ok, _} = GenMagic.Pool.perform(TestPool, absolute_path("Makefile"))
end
-
end