子进程访问的单个应用程序范围的进程
Single application-wide process to be accessed by child processes
我正在编写一个 Elixir 应用程序,其中一些访问数据库的进程将为插入的记录生成唯一标识符。
我正在使用 CUID library,它可以让我通过以下方式生成一个 ID:
{:ok, pid} = Cuid.start_link
Cuid.generate(pid) # => ch72gsb320000udocl363eofy
这是我的应用程序的设置方式
- 有一个处理请求的 phoenix 控制器
- 此控制器调出我的自定义 Repo.insert 命令,该命令当前是同步的
- Repo.insert 每次都调用 Cuid.start_link 和 Cuid.generate
每次都创建一个新的 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)
我正在编写一个 Elixir 应用程序,其中一些访问数据库的进程将为插入的记录生成唯一标识符。
我正在使用 CUID library,它可以让我通过以下方式生成一个 ID:
{:ok, pid} = Cuid.start_link
Cuid.generate(pid) # => ch72gsb320000udocl363eofy
这是我的应用程序的设置方式
- 有一个处理请求的 phoenix 控制器
- 此控制器调出我的自定义 Repo.insert 命令,该命令当前是同步的
- Repo.insert 每次都调用 Cuid.start_link 和 Cuid.generate
每次都创建一个新的 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)