在 Elixir 1.12 应用程序中启动 `:pg` 的默认范围的正确方法是啥?

Posted

技术标签:

【中文标题】在 Elixir 1.12 应用程序中启动 `:pg` 的默认范围的正确方法是啥?【英文标题】:What is the correct way to start `:pg`'s default scope in an Elixir 1.12 application?在 Elixir 1.12 应用程序中启动 `:pg` 的默认范围的正确方法是什么? 【发布时间】:2021-08-29 15:02:00 【问题描述】:

:pg2 模块在 OTP 24 中被删除。它的替换是 :pg。根据documentation:

默认作用域 pg 在 kernel(6) 配置时自动启动。

从基于混合的 Elixir 1.12 应用程序,配置内核以自动启动默认 :pg 范围的正确方法是什么?到目前为止,我一直在这样做,但似乎真的很难编写没有 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

【问题讨论】:

** (Mix) Could not start application pg: could not find application file: pg.app :pg 不是应用程序,它是 Erlang 内核的一部分 【参考方案1】:

您可以为该模块编写自己的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 文档所说的那样“配置内核”(无论 Elixir 意味着什么)。 @Clay 你无法在 Elixir 中轻松配置 kernel。现在最简单的方法可能是在开发中运行 env ERL_FLAGS="-kernel start_pg true" mix 并在生产中完全重启。

以上是关于在 Elixir 1.12 应用程序中启动 `:pg` 的默认范围的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Elixir 主管中引用之前启动的进程

在 elixir 中命名嵌套伞应用程序

如何使用elixir测量磁盘大小?

Erlang - Elixir:啥是监督树?

Elixir shell 中的 Application.stop(...)

[Elixir002]节点启动后自动连接其它节点