子进程访问的单个应用程序范围的进程

Single application-wide process to be accessed by child processes

我正在编写一个 Elixir 应用程序,其中一些访问数据库的进程将为插入的记录生成唯一标识符。

我正在使用 CUID library,它可以让我通过以下方式生成一个 ID:

{:ok, pid} = Cuid.start_link
Cuid.generate(pid)  # => ch72gsb320000udocl363eofy

这是我的应用程序的设置方式

每次都创建一个新的 Cuid 进程对我来说感觉不对,尤其是考虑到 Cuid 库在其状态下维护一个计数器。

我的应用程序中的不同进程如何将 Cuid.generate 发送到同一进程?

谢谢!

您可以注册您的流程:

Process.register(pid, :cuid_process)

这样它就可以被整个系统中的所有进程使用。通常你可以在所有需要常规pid的地方使用注册进程的原子,所以你可以尝试:

Cuid.generate(:cuid_process)

您可以在您的应用程序中将其作为受监督和注册的工作人员启动:

defmodule MyApp do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
      # Start the endpoint when the application starts
      supervisor(MyApp.Endpoint, []),
      # Start the Ecto repository
      worker(MyApp.Repo, []),
      worker(Cuid, [], [name: :cuid])
    ]

    opts = [strategy: :one_for_one, name: MyApp.Supervisor]
    Supervisor.start_link(children, opts)
  end

  ...
end

然后在您的应用程序中使用它,例如:

cuid = Cuid.generate(:cuid)