使用不止一种 erlang 行为

Posted

技术标签:

【中文标题】使用不止一种 erlang 行为【英文标题】:Using more than one erlang behaviour 【发布时间】:2017-11-26 10:06:18 【问题描述】:

我有一个 erlang gen_fsm 进程,它使用 erlang 的内置 gen_tcp 通过 tcp 与远程服务器通信。

我想让它成为一个 web-socket 客户端。经过一番调查,我得到了这个 erlang websocket 客户端库Erlang Websocket client。

看一些例子,看来我必须使用

-行为(websocket_client_handler)。

基本上,我在我的 start_link 中这样做

start_link(UserID) ->
   gen_fsm:start_link(?MODULE, [UserID], []).

但是,另一种行为需要不同的初始化返回值和不同的状态。我的 gen_fsm 已经有了一个状态。

有人可以提供一些上下文吗?

我认为为同一个模块定义两个行为并没有错,但考虑到每个行为在 init/[1/2] 函数中需要不同的返回类型,我开始思考这是否真的可行。只是想联系有经验的人。

谢谢。

【问题讨论】:

【参考方案1】:

原则上我不认为有问题:init/1init/2 是两个完全不同的函数,gen_fsm:start_link 只会调用init/1websocket_client:start_link 只会调用init/2。当然,来自gen_fsm 回调的状态不会传递给websocket_client,所以它们可以完全不同。在实践中,我希望它真的很混乱。

相反,我会将 websocket 客户端分离到一个单独的模块中,该模块从 gen_fsm 调用(如果我理解正确的话)。

【讨论】:

以上是关于使用不止一种 erlang 行为的主要内容,如果未能解决你的问题,请参考以下文章

在这种情况下我应该使用哪种 Erlang 行为,即 gen_server 或 gen_fsm

初学者的 Erlang/OTP 行为

如何分发 Erlang 进程(主管行为)?

Erlang 元组列表与另一个元组列表在单个列表中

Erlang NIF 奇怪的 iolist 行为

我可以在 C 节点中获得 Erlang OTP 行为吗?