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

Ven*_* D. 2 elixir erlang-otp

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

我正在使用CUID库,它将让我以下列方式生成一个id:

{:ok, pid} = Cuid.start_link
Cuid.generate(pid)  # => ch72gsb320000udocl363eofy
Run Code Online (Sandbox Code Playgroud)

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

  • 有一个凤凰控制器处理请求
  • 该控制器调用我的自定义Repo.insert命令,该命令当前是同步的
  • Repo.insert每次调用Cuid.start_link和Cuid.generate

每次创建一个新的Cuid进程对我来说都是错误的,特别是考虑到Cuid lib在其状态下维护一个计数器.

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

谢谢!

Jas*_*son 5

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

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
Run Code Online (Sandbox Code Playgroud)

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

cuid = Cuid.generate(:cuid)
Run Code Online (Sandbox Code Playgroud)