当Elixir注册表进程在崩溃后重新启动时,它是否使用注册密钥恢复?

当Elixir注册表进程在崩溃后重新启动时,它是否使用注册密钥恢复?,elixir,Elixir,根据Elixir,如果注册的进程崩溃,它的键将自动从注册表中删除。 当注册表进程本身崩溃并由主管重新启动时,它是使用已注册进程的密钥恢复还是重新启动?注册表进程重新启动。事实证明,使用交互式长生不老药进行测试很容易 # Create a Registry process and registers an Agent process. {:ok, _} = Registry.start_link(keys: :unique, name: Registry.ViaTest) name = {:vi

根据Elixir,如果注册的进程崩溃,它的键将自动从注册表中删除。
当注册表进程本身崩溃并由主管重新启动时,它是使用已注册进程的密钥恢复还是重新启动?

注册表进程重新启动。事实证明,使用交互式长生不老药进行测试很容易

# Create a Registry process and registers an Agent process.

{:ok, _} = Registry.start_link(keys: :unique, name: Registry.ViaTest)
name = {:via, Registry, {Registry.ViaTest, "agent"}}
{:ok, _} = Agent.start_link(fn -> 0 end, name: name)
iex(4)> Registry.lookup(Registry.ViaTest, "agent")
[{#PID<0.90.0>, nil}]

# Kill Registry process

iex(7)> Process.exit(Process.whereis(Registry.ViaTest), :kill)
** (EXIT from #PID<0.84.0>) evaluator process exited with reason: killed

Interactive Elixir (1.5.0) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> 
15:20:42.180 [error] GenServer Registry.ViaTest.PIDPartition0 terminating
** (stop) killed
Last message: {:EXIT, #PID<0.86.0>, :killed}
State: #Reference<0.2950178278.1828847617.245854>

nil

# Confirm the Registry process died
iex(2)> Process.whereis(Registry.ViaTest)                     
nil

# Restart the Registry process with the same name
iex(3)> {:ok, _} = Registry.start_link(keys: :unique, name: Registry.ViaTest)
{:ok, #PID<0.100.0>}

# Look up previously registered Agent process
iex(4)> Registry.lookup(Registry.ViaTest, "agent")                           
[]
#创建注册表进程并注册代理进程。
{:好的,{}=Registry.start\u链接(key::unique,name:Registry.ViaTest)
name={:via,注册表,{Registry.ViaTest,“代理”}
{:好的,{}=Agent.start\u链接(fn->0-end,name:name)
iex(4)>Registry.lookup(Registry.ViaTest,“代理”)
[{PID,nil}]
#终止注册表进程
iex(7)>Process.exit(Process.whereis(Registry.ViaTest),:kill)
**(退出#PID)评估程序进程退出,原因为:已终止
交互式长生不老药(1.5.0)-按Ctrl+C退出(输入h()以获取帮助)
iex(1)>
15:20:42.180[错误]GenServer Registry.ViaTest.PIDPartition0正在终止
**(停止)死亡
最后一条消息:{:EXIT,#PID,:killed}
状态:#参考
无
#确认注册表进程已停止
iex(2)>进程.whereis(Registry.ViaTest)
无
#用相同的名称重新启动注册表进程
iex(3)>{:ok,{}=Registry.start\u链接(key::unique,name:Registry.ViaTest)
{:好的,#PID}
#查找以前注册的代理进程
iex(4)>Registry.lookup(Registry.ViaTest,“代理”)
[]

注册表进程将重新启动。事实证明,使用交互式长生不老药进行测试很容易

# Create a Registry process and registers an Agent process.

{:ok, _} = Registry.start_link(keys: :unique, name: Registry.ViaTest)
name = {:via, Registry, {Registry.ViaTest, "agent"}}
{:ok, _} = Agent.start_link(fn -> 0 end, name: name)
iex(4)> Registry.lookup(Registry.ViaTest, "agent")
[{#PID<0.90.0>, nil}]

# Kill Registry process

iex(7)> Process.exit(Process.whereis(Registry.ViaTest), :kill)
** (EXIT from #PID<0.84.0>) evaluator process exited with reason: killed

Interactive Elixir (1.5.0) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> 
15:20:42.180 [error] GenServer Registry.ViaTest.PIDPartition0 terminating
** (stop) killed
Last message: {:EXIT, #PID<0.86.0>, :killed}
State: #Reference<0.2950178278.1828847617.245854>

nil

# Confirm the Registry process died
iex(2)> Process.whereis(Registry.ViaTest)                     
nil

# Restart the Registry process with the same name
iex(3)> {:ok, _} = Registry.start_link(keys: :unique, name: Registry.ViaTest)
{:ok, #PID<0.100.0>}

# Look up previously registered Agent process
iex(4)> Registry.lookup(Registry.ViaTest, "agent")                           
[]
#创建注册表进程并注册代理进程。
{:好的,{}=Registry.start\u链接(key::unique,name:Registry.ViaTest)
name={:via,注册表,{Registry.ViaTest,“代理”}
{:好的,{}=Agent.start\u链接(fn->0-end,name:name)
iex(4)>Registry.lookup(Registry.ViaTest,“代理”)
[{PID,nil}]
#终止注册表进程
iex(7)>Process.exit(Process.whereis(Registry.ViaTest),:kill)
**(退出#PID)评估程序进程退出,原因为:已终止
交互式长生不老药(1.5.0)-按Ctrl+C退出(输入h()以获取帮助)
iex(1)>
15:20:42.180[错误]GenServer Registry.ViaTest.PIDPartition0正在终止
**(停止)死亡
最后一条消息:{:EXIT,#PID,:killed}
状态:#参考
无
#确认注册表进程已停止
iex(2)>进程.whereis(Registry.ViaTest)
无
#用相同的名称重新启动注册表进程
iex(3)>{:ok,{}=Registry.start\u链接(key::unique,name:Registry.ViaTest)
{:好的,#PID}
#查找以前注册的代理进程
iex(4)>Registry.lookup(Registry.ViaTest,“代理”)
[]
注册表进程将“重新启动刷新”。(在其管理器中配置)

实际上,所有注册到注册表的进程都会被分配到注册表进程。这意味着当注册表崩溃时,所有注册的进程也将退出,除非它们指定其他行为。

注册表进程将“重新启动”。(在其管理器中配置)


实际上,所有注册到注册表的进程都会被分配到注册表进程。这意味着当注册表崩溃时,所有注册的进程也将退出,除非它们指定其他行为。

如何指定其他行为?@Tangmank当进程在Erlang/Elixir中链接时,您可以设置
trap\u exit
标志,该标志将进程接收到的退出信号转换为正常消息,然后您可以在
handle_info
等中处理它。。请参阅和如何指定其他行为?@tangmank在Erlang/Elixir中链接进程时,您可以设置
trap_exit
标志,该标志将进程接收到的退出信号转换为正常消息,然后您可以在
handle_info
等中处理它。。看到和