假设 aPid
注册如下。
register(foobar, Pid).
现在我想替换关联的 pid:
unregister(foobar),
register(foobar, NewPid).
我怎样才能以原子方式实现这一目标?
使用gproc
,https://github.com/uwiger/gproc
优点是它的注册表是一个 ETS 表,ETS 表具有原子更新,您可以像您想要的那样原子地覆盖名称。我几乎肯定它可以做这种事情。
我不认为这是可能的,至少,使用register/2
和unregister/1
BIFs。您需要序列化对注册表的请求,例如使用 agen_server
或ETS table
.
另外,请考虑以下事项。进程的注册名称是原子和原子,在 Erlang VM 中,是有限的,而不是垃圾收集的。如果您正在动态注册/注销进程,则需要大量进程(例如,每个请求一个进程),您可能需要重新考虑这种方法,因为您可能会在某些时候用完原子。