在Erlang中,如何使用与传统语言中的全局变量不同的注册过程?

Zub*_*air 3 erlang actor

对我来说,他们似乎是同一件事,只是注册过程被术语"演员"伪装.

更新:

我已经看到了我的思维错误.我想我是Erlang的新手,我在他们根本不属于的地方使用演员(这个地方有反模式的名字吗?)

Chr*_*ian 7

我经常看到使用进程注册的示例来简化示例代码(通过避免另一个函数参数).这样做的结果是新手倾向于使用过程注册(猴子看,猴子做).

他们(新手)倾向于将注册更改为正常运营的一部分.他们倾向于构造原子以注册为,并且有其他过程构造原子来查找过程.当你这样做,那么你有共享状态并发(有限,但仍然很糟糕).

注册表应该用于(好吧,这些是我自己的规则,何时使用它们):

  • 长期服务.然后它就像你提到诸如光速之类的常数一样具有全局状态.
  • 注册进程以帮助调试正在运行的系统,但这些名称永远不应该由代码引用,只能由shell中的人员引用

注册的名称应该有一个前缀(通常是应用程序名称),长时间运行的应用程序应该在OTP .app文件中.


I G*_*ICE 5

已注册的进程进程ID(Pid)的全局标识符,它本身就是一种处理进程的全局方式(事先未知).

然而,说使用全局标识符与全局变量相同将问题完全混淆了很多.它类似于'URIs是全局变量'之类的东西.在范围,可变性,封装和数据隔离方面存在根本差异,这使得它们真正不同.

请注意,actor模型是关于并发计算的一般概念.Erlang进程只是实现actor模型的许多潜在方法之一.Scala,E,Axum和许多其他语言都支持使用actor编程,但实现方式却截然不同.