erlang - 在 Erlang 热代码重载功能中触发更新消息
问题描述
我正在按照LYAE的指南尝试 erlang 的热代码功能,但我不明白如何制作update
消息被触发。
我有一个运行可升级方法的模块:
模块
-module(upgrade).
-export([main/1,upgrade/1,init/1,init_link/1]).
-record(state,{ version=0,comments=""}).
init(State)->
spawn(?MODULE,main,[State]).
main(State)->
receive
update->
NewState=?MODULE:upgrade(State),
if NewState#state.version>3 -> exit("Max Version Reached") end,
?MODULE:main(NewState);
SomeMessage->
main(State)
end.
upgrade(State=#state{version=Version,comments=Comments})->
Comm=case Version rem 2 of
0 -> "Even version";
_ -> "Uneven version"
end,
#state{version=Version+1,comments=Comm}.
壳
>c(upgrade).
>rr(upgrade,state).
>U=upgrade:init(#state{version=0,comments="initial"}).
>Monitor=monitor(process,U).
> ......to something to trigger the update message
> flush(). % see the exit message reason
我不明白如何执行热代码重新加载以触发update
消息。我想从我的方法flush
中获取退出原因。main
解决方案
该进程期望将原子update
作为消息获取。由于变量中有进程的 pid,因此U
您可以像这样发送消息:
U ! update.
请注意,字符串Even version
和Uneven version
仅保留在状态中,从不打印,因此您不会看到这些。您唯一会看到的是退出消息,发送update
四次并调用flush()
.
推荐阅读
- reactjs - 未处理的拒绝(TypeError):this.props.dispatch(...).then 不是函数
- algorithm - 为保证唯一性但最多允许 3 个面相同的拼图块分配边缘值的算法?
- c - C中字符的频率(当我阅读字符时发出)
- split - 我们什么时候应该将数据集拆分为测试和训练?
- node.js - 如何清除nodejs中测试之间的全局变量?
- amazon-web-services - VPC 中的 Elastic Beanstalk 应用程序无法公开访问
- algorithm - 如果我有排序数组,有没有办法在合并排序算法中恢复两个排序的一半?
- python - 带有示例数据集但延迟下载的 Python 包?
- python - Pyglet 3-D 的渲染在图像中添加了额外的像素
- c - 使用参数 C 执行 SSH 远程脚本