查看源代码 pg (kernel v10.2)
分布式命名进程组。
此模块实现进程组。可以将消息发送给一个、一些或所有组成员。
在 OTP 17 之前,stdlib
中存在一个实验性的 pg
模块。此 pg
模块与该实验性的 pg
模块不是同一个模块,只是共享相同的模块名称。
可以通过一个公共名称访问一组进程。例如,如果存在一个名为 foobar
的组,则可能存在一组进程(可以位于不同的节点上)都是 foobar
组的成员。没有用于向组发送消息的特殊函数。相反,客户端函数应使用 get_members/1
和 get_local_members/1
函数来确定哪些进程是该组的成员。然后可以将消息发送给一个或多个组成员。
如果成员终止,它将自动从组中删除。
一个进程可以加入多个组。它可以多次加入同一个组。它只允许加入在本地节点上运行的进程。
进程组实现强最终一致性。进程组成员视图可能会暂时出现分歧。例如,当 node1
和 node2
上的进程同时加入时,node3
和 node4
可能会以不同的顺序接收更新。
成员视图不是传递的。如果 node1
没有直接连接到 node2
,它们将看不到彼此的组。但是如果两者都连接到 node3
,node3
将拥有完整的视图。
当任何进程加入时,会自动创建组,当所有进程离开组时,组将被删除。不存在的组被视为空(不包含任何进程)。
进程组可以组织成多个作用域。作用域之间完全相互独立。一个进程可以加入任意数量的作用域中的任意数量的组。作用域旨在将单个网格解耦为一组覆盖网络,减少传播组成员信息所需的流量。当 Kernel 配置为执行此操作时,默认作用域 pg
将自动启动。
注意
作用域名称用于在本地注册进程,并用于命名 ETS 表。如果此名称下已注册另一个进程,或存在另一个 ETS 表,则作用域将无法启动。
如果作用域进程退出并重新启动,则本地成员资格不会保留。
可以通过使用群集范围内唯一的作用域名称,例如节点名称来保持作用域仅限本地:
pg:start_link(node()).
另请参阅
摘要
函数
取消订阅调用者对更新(作用域或组)的订阅。刷新调用进程消息队列中所有未完成的更新。
返回组 Group
中在本地节点上运行的所有进程。返回的进程没有特定的顺序。此函数已针对速度进行了优化。
返回组 Group
中的所有进程。返回的进程没有特定的顺序。此函数已针对速度进行了优化。
将单个进程或多个进程加入组 Group
。一个进程可以多次加入一个组,然后必须离开该组相同的次数。
使进程 PidOrPids
离开组 Group
。如果该进程不是该组的成员,则返回 not_joined
。
订阅调用者以获取指定组的更新。
订阅调用者以获取指定作用域的更新。
启动其他作用域。
在监督树中启动默认 pg
作用域。
等效于 start(Scope)
,但它还会使用调用进程创建一个 link/1
。
返回所有已知组的列表。
类型
函数
-spec demonitor(Ref :: reference()) -> ok | false.
等效于 demonitor(pg, Ref)
。
取消订阅调用者对更新(作用域或组)的订阅。刷新调用进程消息队列中所有未完成的更新。
返回组 Group
中在本地节点上运行的所有进程。返回的进程没有特定的顺序。此函数已针对速度进行了优化。
返回组 Group
中的所有进程。返回的进程没有特定的顺序。此函数已针对速度进行了优化。
将单个进程或多个进程加入组 Group
。一个进程可以多次加入一个组,然后必须离开该组相同的次数。
PidOrPids
可能包含多次相同的进程。
使进程 PidOrPids
离开组 Group
。如果该进程不是该组的成员,则返回 not_joined
。
当进程列表作为 PidOrPids
传递时,仅当列表中所有进程都未加入时,该函数才会返回 not_joined
。
等效于 monitor(pg, Group)
。
订阅调用者以获取指定组的更新。
返回当前组中的进程列表,以及用于匹配即将到来的通知的引用。
有关更新消息结构,请参阅 monitor_scope/0
。
等效于 monitor_scope(pg)
。
订阅调用者以获取指定作用域的更新。
返回整个作用域的内容以及用于匹配即将到来的通知的引用。
每当任何组成员资格发生更改时,都会向订阅者发送更新消息
{Ref, join, Group, [JoinPid1, JoinPid2]}
{Ref, leave, Group, [LeavePid1]}
启动其他作用域。
在监督树中启动默认 pg
作用域。
可以通过设置内核配置参数 start_pg
来配置内核自动执行此操作。
等效于 start(Scope)
,但它还会使用调用进程创建一个 link/1
。
-spec which_groups() -> [Group :: group()].
等效于 which_groups(pg)
。
返回所有已知组的列表。