【发布时间】:2019-06-19 12:54:32
【问题描述】:
可以从正在运行的 Erlang/Elixir 系统中删除原子吗?
具体来说,我对如何创建一个应用程序服务器感兴趣,在该服务器中,代表应用程序的模块可以按需加载和运行,然后再删除。
我认为这比仅仅删除代表相关模块的原子更复杂,因为它可能定义了更多可能难以或不可能跟踪的原子。
另外,我想知道一个模块是否可以单独运行,以便它产生的所有引用可以在不再需要时从正在运行的系统中有效地删除。
编辑:只是澄清一下,因为 SO 认为这个问题在其他地方得到了回答,所以这个问题与原子的垃圾收集无关,而是与原子的手动管理有关。为了进一步澄清,以下是我对亚历克斯回答的评论:
我也考虑过启动单独的实例(节点?),但是 对于按需的、按用户的应用程序来说,这将是非常昂贵的。 我想做的是模仿 SAP ABAP 系统的工作方式。一 选项可能是先发制人地拥有一定数量的实例 运行,然后在每次请求完成时重新启动它们。 (再次, 虽然相当昂贵)。另一种可能是监控原子表 一个实例,并在接近限制时重新启动该实例。
我看到运行多个节点/实例的缺点(尽管那是 ABAP 系统所具有的;多个 OS 进程为用户的请求提供服务)是您失去了在这些实例之间共享缓存字节码的能力。在 ABAP 系统中,字节码的缓存(他们称之为“加载”)可供不同的进程访问,因此当程序启动时,它会先检查缓存,然后再从存储中获取。
【问题讨论】:
-
@7stud 我确实在其他地方读到过这个函数,但我不明白它是如何应用的,或者它应该如何提供帮助。
-
您的问题实际上是关于删除模块,而不是删除代表模块名称的原子。看看 erts 中的代码模块。有 purge/1 和 remove/1 功能。