【问题标题】:Does Erlang (and Elixir by extension) provide a way to remove atoms? [duplicate]Erlang(和 Elixir 的扩展)是否提供了一种删除原子的方法? [复制]
【发布时间】:2019-06-19 12:54:32
【问题描述】:

可以从正在运行的 Erlang/Elixir 系统中删除原子吗?

具体来说,我对如何创建一个应用程序服务器感兴趣,在该服务器中,代表应用程序的模块可以按需加载和运行,然后再删除。

我认为这比仅仅删除代表相关模块的原子更复杂,因为它可能定义了更多可能难以或不可能跟踪的原子。

另外,我想知道一个模块是否可以单独运行,以便它产生的所有引用可以在不再需要时从正在运行的系统中有效地删除。

编辑:只是澄清一下,因为 SO 认为这个问题在其他地方得到了回答,所以这个问题与原子的垃圾收集无关,而是与原子的手动管理有关。为了进一步澄清,以下是我对亚历克斯回答的评论:

我也考虑过启动单独的实例(节点?),但是 对于按需的、按用户的应用程序来说,这将是非常昂贵的。 我想做的是模仿 SAP ABAP 系统的工作方式。一 选项可能是先发制人地拥有一定数量的实例 运行,然后在每次请求完成时重新启动它们。 (再次, 虽然相当昂贵)。另一种可能是监控原子表 一个实例,并在接近限制时重新启动该实例。

我看到运行多个节点/实例的缺点(尽管那是 ABAP 系统所具有的;多个 OS 进程为用户的请求提供服务)是您失去了在这些实例之间共享缓存字节码的能力。在 ABAP 系统中,字节码的缓存(他们称之为“加载”)可供不同的进程访问,因此当程序启动时,它会先检查缓存,然后再从存储中获取。

【问题讨论】:

  • @7stud 我确实在其他地方读到过这个函数,但我不明白它是如何应用的,或者它应该如何提供帮助。
  • 您的问题实际上是关于删除模块,而不是删除代表模块名称的原子。看看 erts 中的代码模块。有 purge/1 和 remove/1 功能。

标签: erlang elixir


【解决方案1】:

不幸的是,在 VM 关闭之前,原子在 VM 中根本不会被破坏。原子限制也在进程之间共享,这意味着在您的情况下,生成一个新进程来处理原子分配/释放将不起作用。

通过运行单独的 Erlang 应用程序并通过套接字与其通信,您可能会很幸运地生成一个完全独立的 VM 实例,尽管我不确定这会有多有效。

【讨论】:

  • 我还考虑过启动单独的实例(节点?),但这对于按需、按用户的应用程序来说会非常昂贵。我想做的是模仿 SAP ABAP 系统的工作方式。一种选择可能是先发制人地运行一定数量的实例,然后在每次请求完成时重新启动它们。 (同样,虽然相当昂贵)。另一种可能是监控实例的原子表,并在接近限制时重新启动该实例。
  • 您还可以增加每个实例允许的原子数量。只要您的环境有足够的内存来保存这些原子,一切都应该没问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多