整洁的 Elixir 技巧:库也可以启动进程

2021-08-03 04:58:48

如果你习惯了其他语言,这种事情会让你非常怀疑。库代码开始自己的进程——你几乎可以感觉到混乱并感觉到只是在思考它的错误。然而在 Elixir(当然还有 Erlang)中,这是完全正常的事情。 Elixir 共享可变状态的方法是将它包装在一个进程中。在这种情况下,我需要一个计数器,实现它的最简单方法是使用代理,这是一种旨在处理简单状态的过程。在这种情况下,get_and_update 函数允许我返回计数器并将其作为原子操作递增。要启动代理,请使用 Agent.start_link 函数。但是在哪里调用呢?我是否必须向我的库中添加一些等效的初始化函数?虽然不是很繁重,但感觉很尴尬,就像我的实现泄漏到调用者中一样。那么我是否必须在某处停止代理进程?我会在哪里做?现在我想出了如何在库中自己管理代理进程的生命周期。但事实证明这是不必要的。我所要做的就是对 mix.exs 文件进行一项更改,并对库中的模块进行一项添加。这足以让任何使用我的库(称为 Ergo,顺便说一句)的应用程序知道将自动启动代理并管理其生命周期。没有我或调用应用程序,根本不需要了解它。