Erlang 二郎:为什么可以';我不能注册self()吗?
此行失败,出现Erlang 二郎:为什么可以';我不能注册self()吗?,erlang,Erlang,此行失败,出现badarg异常: register(myproc, self()), 文档中说,self/0返回一个pid,register/2接受一个pid。那么是什么原因呢 编辑:不,说真的,它还没有注册,它不是一个保留的原子,当我从生成它的进程中注册它时,它就工作了 哦,奇怪!好吧,我还有一些线索。当我将对register()的调用移动到不同的位置时,它有时工作,有时中断。这是我的示例代码。在你叫我疯子之前,先运行它。:-) myproc已经注册了吗 第一次调用应成功,其他调用将导致ba
badarg
异常:
register(myproc, self()),
文档中说,self/0
返回一个pid,register/2
接受一个pid。那么是什么原因呢
编辑:不,说真的,它还没有注册,它不是一个保留的原子,当我从生成它的进程中注册它时,它就工作了
哦,奇怪!好吧,我还有一些线索。当我将对register()
的调用移动到不同的位置时,它有时工作,有时中断。这是我的示例代码。在你叫我疯子之前,先运行它。:-)
myproc已经注册了吗 第一次调用应成功,其他调用将导致badarg异常
1> register(myproc, self()).
true
2> myproc ! foo.
foo
3> flush().
Shell got foo
ok
4> register(myproc, self()).
** exception error: bad argument
in function register/2
called as register(myproc,<0.30.0>)
1>寄存器(myproc,self())。
真的
2> myproc!福。
福
3> 刷新()。
Shell得到了foo
好啊
4> 寄存器(myproc,self())。
**异常错误:参数错误
在功能寄存器/2中
称为寄存器(myproc,)
myproc是否已注册
第一次调用应成功,其他调用将导致badarg异常
1> register(myproc, self()).
true
2> myproc ! foo.
foo
3> flush().
Shell got foo
ok
4> register(myproc, self()).
** exception error: bad argument
in function register/2
called as register(myproc,<0.30.0>)
1>寄存器(myproc,self())。
真的
2> myproc!福。
福
3> 刷新()。
Shell得到了foo
好啊
4> 寄存器(myproc,self())。
**异常错误:参数错误
在功能寄存器/2中
称为寄存器(myproc,)
如果进程已注册,它将抛出badarg。还有其他一些情况会导致这种情况,例如名称已经被使用。更多信息,请参阅
编辑
您发布代码来重现您的问题,这很好
因此,第一次输入pongr/0
时,您将注册self()
。当您收到消息时,您将对其进行处理并再次调用pongr/0
。第二次输入pongr/0
时,您尝试注册self()
,该操作失败,因为它已注册
另外,如果您想使用register来注册大量的进程,您应该仔细研究
register/2
需要一个原子作为密钥,并且有大约一百万个原子的限制,除非您明确更改它。看gproc
也可以分布式运行,因此可以代替global
模块使用。如果进程已经注册,它将抛出一个badarg。还有其他一些情况会导致这种情况,例如名称已经被使用。更多信息,请参阅
编辑
您发布代码来重现您的问题,这很好
因此,第一次输入pongr/0
时,您将注册self()
。当您收到消息时,您将对其进行处理并再次调用pongr/0
。第二次输入pongr/0
时,您尝试注册self()
,该操作失败,因为它已注册
另外,如果您想使用register来注册大量的进程,您应该仔细研究
register/2
需要一个原子作为密钥,并且有大约一百万个原子的限制,除非您明确更改它。看gproc
也可以分布式运行,因此可以用来代替global
模块。对不起,我不是有意冒犯您。请参阅我编辑的答案,以了解代码中问题的解释。哦,哦,哦!!!我几乎感到尴尬,因为我以前没有看到它。另外,谢谢你的奖金提示和效率链接。对不起,我不是有意冒犯你的。请参阅我编辑的答案,以了解代码中问题的解释。哦,哦,哦!!!我几乎感到尴尬,因为我以前没有看到它。另外,感谢您的奖金提示和效率链接。