Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang热代码加载无法保持状态_Erlang - Fatal编程技术网

Erlang热代码加载无法保持状态

Erlang热代码加载无法保持状态,erlang,Erlang,我是erlang编程的初学者。为了更好地理解热代码加载,我使用了以下示例(我向发送Pid添加了响应以进行调试): 一切都很好。我可以通过c(计数器)加载模块。在shell中,通过Pid=spawn(fun counter:start/0)生成新进程。并向生成的进程发送消息。当我现在将一个新模式添加到接收表达式reset->loop(0)并通过c(计数器)重新加载代码时,一切正常,新代码被加载,Sum保持其增量值等 但是当我发送{code\u开关,self()}消息时,Sum在调用loop(Sum

我是erlang编程的初学者。为了更好地理解热代码加载,我使用了以下示例(我向发送Pid添加了响应以进行调试):

一切都很好。我可以通过
c(计数器)加载模块。
在shell中,通过
Pid=spawn(fun counter:start/0)生成新进程。
并向生成的进程发送消息。当我现在将一个新模式添加到接收表达式
reset->loop(0)
并通过
c(计数器)重新加载代码时,
一切正常,新代码被加载,
Sum
保持其增量值等

但是当我发送
{code\u开关,self()}
消息时,
Sum
在调用
loop(Sum)
时被重置为0(
FromPid!{switched,Sum}
调用
FromPid!{switched,Sum}
仍然返回正确的状态)

我遗漏了什么,为什么在第一次调用代码切换函数后我的状态消失了

谢谢你的帮助

| 18 | Pid ! {counter, self()}.
{counter,<0.49.0>}
| 19 | flush().
Shell got {counter,6}
ok
| 20 | Pid ! {code_switch, self()}.
{code_switch,<0.49.0>}
| 21 | flush().
Shell got {switch,6}
Shell got {switched,6}
ok
| 22 | Pid ! {counter, self()}.
{counter,<0.49.0>}
| 23 | flush().
Shell got {counter,0}
ok
EDIT:我发现,当我通过
spawn/3
生成进程时,也就是
spawn(counter,start,[])。
,这是有效的。当我通过
spawn/1
,aka
spawn(有趣的计数器:start/0)
生成进程时,这不会发生 工作这是预期的行为吗?我错过了什么

spawn/1的状态:

将应用程序Fun启动的新进程的进程标识符返回到空列表[]。否则会像spawn/3一样工作


编辑:。。。。aa在尝试在Ubuntu虚拟机上复制后(没有发生),我现在也无法复制(现在将测试我的内存是否损坏)

这不是我在测试程序时看到的行为:

25> LPid ! {counter, self()}.
{counter,<0.39.0>}
26> flush().
Shell got {counter,6}
ok
27> c(counter).
{ok,counter}
28> LPid ! {counter, self()}.
{counter,<0.39.0>}
29> flush().                 
Shell got {counter,6}
ok
30> LPid ! {increment, 2}.
{increment,2}
31> LPid ! {counter, self()}.
{counter,<0.39.0>}
32> flush().                 
Shell got {counter,8}
ok
33> LPid ! {code_switch, self()}.
{code_switch,<0.39.0>}
34> flush().                     
Shell got {switch,8}
Shell got {switched,8}
ok
35> LPid ! {counter, self()}.    
{counter,<0.39.0>}
36> flush().                 
Shell got {counter,8}
ok
25>LPid!{计数器,self()}。
{计数器,}
26>刷新()。
Shell得到{counter,6}
好啊
27>c(计数器)。
{好的,计数器}
28>LPid!{计数器,self()}。
{计数器,}
29>刷新()。
Shell得到{counter,6}
好啊
30>LPid!{增量,2}。
{增量,2}
31>LPid!{计数器,self()}。
{计数器,}
32>刷新()。
Shell得到{counter,8}
好啊
33>LPid!{code_开关,self()}。
{code_开关,}
34>刷新()。
Shell得到{开关,8}
Shell被{切换,8}
好啊
35>LPid!{计数器,self()}。
{计数器,}
36>刷新()。
Shell得到{counter,8}
好啊

您是否可以向某些函数中添加一些日志,如
io:format(“DebugInfo:~p~n”,“Sum”)。
以查看发生了什么情况?

我将
io:format(“DebugInfo:~p~n”,“Sum”)作为
循环中的第一个表达式。结果仍然存在。当在代码开关之后调用
循环
时,
Sum
为0。。(有关shell输出,请参阅我的帖子。)为了回答您的编辑,我使用spawn启动了此过程:
start()->spawn(fun()->loop(0)end)。
。最后,所有提到的方法都是有效的,这可能取决于其他方面,而不是您如何启动循环过程。
12> Pid ! {code_switch, self()}.
DebugInfo:3
{code_switch,<0.33.0>}
DebugInfo:0
13> flush().
Shell got {switch,3}
Shell got {switched,3}
ok
25> LPid ! {counter, self()}.
{counter,<0.39.0>}
26> flush().
Shell got {counter,6}
ok
27> c(counter).
{ok,counter}
28> LPid ! {counter, self()}.
{counter,<0.39.0>}
29> flush().                 
Shell got {counter,6}
ok
30> LPid ! {increment, 2}.
{increment,2}
31> LPid ! {counter, self()}.
{counter,<0.39.0>}
32> flush().                 
Shell got {counter,8}
ok
33> LPid ! {code_switch, self()}.
{code_switch,<0.39.0>}
34> flush().                     
Shell got {switch,8}
Shell got {switched,8}
ok
35> LPid ! {counter, self()}.    
{counter,<0.39.0>}
36> flush().                 
Shell got {counter,8}
ok