在 Elixir 1.12 应用程序中启动 `:pg` 的默认作用域的正确方法是什么?
What is the correct way to start `:pg`'s default scope in an Elixir 1.12 application?
OTP 24 中删除了 :pg2
模块。它的替代品是 :pg
。根据 documentation:
Default scope pg is started automatically when kernel(6) is configured to do so.
从基于 mix 的 Elixir 1.12 应用程序中,配置内核以自动启动默认 :pg
作用域的正确方法是什么?到目前为止,我一直在这样做,但似乎真的 hack-y 使得编写没有 start/2
函数的库代码变得不可能:
defmodule MyApp do
use Application
def start(_type, _args) do
# Ew, gross:
{:ok, _pid} = :pg.start_link()
children() |> Supervisor.start_link([strategy: :one_for_one, name: __MODULE__])
end
def children, do: []
end
您可以为该模块编写自己的 child_spec
:
defmodule MyApp do
use Application
def start(_type, _args) do
Supervisor.start_link(children(), strategy: :one_for_one, name: __MODULE__)
end
defp children, do: [pg_spec()]
defp pg_spec do
%{
id: :pg,
start: {:pg, :start_link, []}
}
end
end
OTP 24 中删除了 :pg2
模块。它的替代品是 :pg
。根据 documentation:
Default scope pg is started automatically when kernel(6) is configured to do so.
从基于 mix 的 Elixir 1.12 应用程序中,配置内核以自动启动默认 :pg
作用域的正确方法是什么?到目前为止,我一直在这样做,但似乎真的 hack-y 使得编写没有 start/2
函数的库代码变得不可能:
defmodule MyApp do
use Application
def start(_type, _args) do
# Ew, gross:
{:ok, _pid} = :pg.start_link()
children() |> Supervisor.start_link([strategy: :one_for_one, name: __MODULE__])
end
def children, do: []
end
您可以为该模块编写自己的 child_spec
:
defmodule MyApp do
use Application
def start(_type, _args) do
Supervisor.start_link(children(), strategy: :one_for_one, name: __MODULE__)
end
defp children, do: [pg_spec()]
defp pg_spec do
%{
id: :pg,
start: {:pg, :start_link, []}
}
end
end