使用 genservers 将内存状态添加到 Web API
Adding in-memory state to a web API with genservers
我目前正在尝试在 Elixir 中构建一个小型网络 API,它需要一些内存状态。简而言之,用户第一次使用 API 时,他会启动一个特定的业务流程,之后他可以继续进行进一步的 API 调用。
为此,我发现最好的方法是创建一个 GenServer,将状态存储在那里,然后通过 PID 进行进一步的 API 调用。
在尝试搜索如何 stringify
PID 以便在每个 API 调用中 return 它时,我发现 this thread 说:
PIDs aren't guaranteed to be unique as they get recycled.
所以我的问题是:这种情况的最佳方法是什么?通常如何解决?
:erlang.make_ref()可用于创建唯一标识符:
iex(1)> :erlang.make_ref()
#Reference<0.3918424786.2664955905.32640>
iex(2)>
(您有什么理由不想使用 System.unique_integer/1 吗?)
Elixir 文档 mention Reference
、Pid
、Port
数据类型,但我找不到关于 Reference
类型的任何信息在 Elixir 中,例如Elixir 是否有创建引用的本机函数。
回复评论:
以下是在 Elixir 中将引用转换为字符串*的方法:
iex(4)> make_ref() |> inspect()
"#Reference<0.784388646.1821114370.207624>"
*在找到 Kernel.make_ref()
.
的评论中归功于 Hauleth
would that work?
根据 Kernel docs:
The returned reference will re-occur after approximately 2^82 calls;
therefore it is unique enough for practical purposes.
我目前正在尝试在 Elixir 中构建一个小型网络 API,它需要一些内存状态。简而言之,用户第一次使用 API 时,他会启动一个特定的业务流程,之后他可以继续进行进一步的 API 调用。
为此,我发现最好的方法是创建一个 GenServer,将状态存储在那里,然后通过 PID 进行进一步的 API 调用。
在尝试搜索如何 stringify
PID 以便在每个 API 调用中 return 它时,我发现 this thread 说:
PIDs aren't guaranteed to be unique as they get recycled.
所以我的问题是:这种情况的最佳方法是什么?通常如何解决?
:erlang.make_ref()可用于创建唯一标识符:
iex(1)> :erlang.make_ref()
#Reference<0.3918424786.2664955905.32640>
iex(2)>
(您有什么理由不想使用 System.unique_integer/1 吗?)
Elixir 文档 mention Reference
、Pid
、Port
数据类型,但我找不到关于 Reference
类型的任何信息在 Elixir 中,例如Elixir 是否有创建引用的本机函数。
回复评论:
以下是在 Elixir 中将引用转换为字符串*的方法:
iex(4)> make_ref() |> inspect()
"#Reference<0.784388646.1821114370.207624>"
*在找到 Kernel.make_ref()
.
would that work?
根据 Kernel docs:
The returned reference will re-occur after approximately 2^82 calls; therefore it is unique enough for practical purposes.