查看源代码 pg (kernel v10.2)

分布式命名进程组。

此模块实现进程组。可以将消息发送给一个、一些或所有组成员。

在 OTP 17 之前,stdlib 中存在一个实验性的 pg 模块。此 pg 模块与该实验性的 pg 模块不是同一个模块,只是共享相同的模块名称。

可以通过一个公共名称访问一组进程。例如,如果存在一个名为 foobar 的组,则可能存在一组进程(可以位于不同的节点上)都是 foobar 组的成员。没有用于向组发送消息的特殊函数。相反,客户端函数应使用 get_members/1get_local_members/1 函数来确定哪些进程是该组的成员。然后可以将消息发送给一个或多个组成员。

如果成员终止,它将自动从组中删除。

一个进程可以加入多个组。它可以多次加入同一个组。它只允许加入在本地节点上运行的进程。

进程组实现强最终一致性。进程组成员视图可能会暂时出现分歧。例如,当 node1node2 上的进程同时加入时,node3node4 可能会以不同的顺序接收更新。

成员视图不是传递的。如果 node1 没有直接连接到 node2,它们将看不到彼此的组。但是如果两者都连接到 node3node3 将拥有完整的视图。

当任何进程加入时,会自动创建组,当所有进程离开组时,组将被删除。不存在的组被视为空(不包含任何进程)。

进程组可以组织成多个作用域。作用域之间完全相互独立。一个进程可以加入任意数量的作用域中的任意数量的组。作用域旨在将单个网格解耦为一组覆盖网络,减少传播组成员信息所需的流量。当 Kernel 配置为执行此操作时,默认作用域 pg 将自动启动。

注意

作用域名称用于在本地注册进程,并用于命名 ETS 表。如果此名称下已注册另一个进程,或存在另一个 ETS 表,则作用域将无法启动。

如果作用域进程退出并重新启动,则本地成员资格不会保留。

可以通过使用群集范围内唯一的作用域名称,例如节点名称来保持作用域仅限本地:pg:start_link(node()).

另请参阅

内核

摘要

类型

进程组的标识符。

函数

取消订阅调用者对更新(作用域或组)的订阅。刷新调用进程消息队列中所有未完成的更新。

返回组 Group 中在本地节点上运行的所有进程。返回的进程没有特定的顺序。此函数已针对速度进行了优化。

返回组 Group 中的所有进程。返回的进程没有特定的顺序。此函数已针对速度进行了优化。

将单个进程或多个进程加入组 Group。一个进程可以多次加入一个组,然后必须离开该组相同的次数。

使进程 PidOrPids 离开组 Group。如果该进程不是该组的成员,则返回 not_joined

订阅调用者以获取指定组的更新。

订阅调用者以获取指定作用域的更新。

启动其他作用域。

在监督树中启动默认 pg 作用域。

等效于 start(Scope),但它还会使用调用进程创建一个 link/1

返回所有已知组的列表。

类型

链接到此类型

group()

查看源代码 (未导出) (自 OTP 23.0 起)
-type group() :: any().

进程组的标识符。

函数

链接到此函数

demonitor(Ref)

查看源代码 (自 OTP 25.1 起)
-spec demonitor(Ref :: reference()) -> ok | false.

等效于 demonitor(pg, Ref)

链接到此函数

demonitor(Scope, Ref)

查看源代码 (自 OTP 25.1 起)
-spec demonitor(Scope :: atom(), Ref :: reference()) -> ok | false.

取消订阅调用者对更新(作用域或组)的订阅。刷新调用进程消息队列中所有未完成的更新。

链接到此函数

get_local_members(Group)

查看源代码 (自 OTP 23.0 起)
-spec get_local_members(Group :: group()) -> [pid()].

等效于 get_local_members(pg, Group)

链接到此函数

get_local_members(Scope, Group)

查看源代码 (自 OTP 23.0 起)
-spec get_local_members(Scope :: atom(), Group :: group()) -> [pid()].

返回组 Group 中在本地节点上运行的所有进程。返回的进程没有特定的顺序。此函数已针对速度进行了优化。

链接到此函数

get_members(Group)

查看源代码 (自 OTP 23.0 起)
-spec get_members(Group :: group()) -> [pid()].

等效于 get_members(pg, Group)

链接到此函数

get_members(Scope, Group)

查看源代码 (自 OTP 23.0 起)
-spec get_members(Scope :: atom(), Group :: group()) -> [pid()].

返回组 Group 中的所有进程。返回的进程没有特定的顺序。此函数已针对速度进行了优化。

链接到此函数

join(Group, PidOrPids)

查看源代码 (自 OTP 23.0 起)
-spec join(Group :: group(), PidOrPids :: pid() | [pid()]) -> ok.

等效于 join(pg, Group, PidOrPids)

链接到此函数

join(Scope, Group, PidOrPids)

查看源代码 (自 OTP 23.0 起)
-spec join(Scope :: atom(), Group :: group(), PidOrPids :: pid() | [pid()]) -> ok.

将单个进程或多个进程加入组 Group。一个进程可以多次加入一个组,然后必须离开该组相同的次数。

PidOrPids 可能包含多次相同的进程。

链接到此函数

leave(Group, PidOrPids)

查看源代码 (自 OTP 23.0 起)
-spec leave(Group :: group(), PidOrPids :: pid() | [pid()]) -> ok.

等效于 leave(pg, Group, PidOrPids)

链接到此函数

leave(Scope, Group, PidOrPids)

查看源代码 (自 OTP 23.0 起)
-spec leave(Scope :: atom(), Group :: group(), PidOrPids :: pid() | [pid()]) -> ok | not_joined.

使进程 PidOrPids 离开组 Group。如果该进程不是该组的成员,则返回 not_joined

当进程列表作为 PidOrPids 传递时,仅当列表中所有进程都未加入时,该函数才会返回 not_joined

链接到此函数

monitor(Group)

查看源代码 (自 OTP 25.1 起)
-spec monitor(Group :: group()) -> {reference(), [pid()]}.

等效于 monitor(pg, Group)

链接到此函数

monitor(Scope, Group)

查看源代码 (自 OTP 25.1 起)
-spec monitor(Scope :: atom(), Group :: group()) -> {reference(), [pid()]}.

订阅调用者以获取指定组的更新。

返回当前组中的进程列表,以及用于匹配即将到来的通知的引用。

有关更新消息结构,请参阅 monitor_scope/0

链接到此函数

monitor_scope()

查看源代码 (自 OTP 25.1 起)
-spec monitor_scope() -> {reference(), #{group() => [pid()]}}.

等效于 monitor_scope(pg)

链接到此函数

monitor_scope(Scope)

查看源代码 (自 OTP 25.1 起)
-spec monitor_scope(Scope :: atom()) -> {reference(), #{group() => [pid()]}}.

订阅调用者以获取指定作用域的更新。

返回整个作用域的内容以及用于匹配即将到来的通知的引用。

每当任何组成员资格发生更改时,都会向订阅者发送更新消息

{Ref, join, Group, [JoinPid1, JoinPid2]}
{Ref, leave, Group, [LeavePid1]}
链接到此函数

start(Scope)

查看源代码 (自 OTP 23.0 起)
-spec start(Scope :: atom()) -> {ok, pid()} | {error, any()}.

启动其他作用域。

链接到此函数

start_link()

查看源代码 (自 OTP 23.0 起)
-spec start_link() -> {ok, pid()} | {error, any()}.

在监督树中启动默认 pg 作用域。

可以通过设置内核配置参数 start_pg 来配置内核自动执行此操作。

链接到此函数

start_link(Scope)

查看源代码 (自 OTP 23.0 起)
-spec start_link(Scope :: atom()) -> {ok, pid()} | {error, any()}.

等效于 start(Scope),但它还会使用调用进程创建一个 link/1

链接到此函数

which_groups()

查看源代码 (自 OTP 23.0 起)
-spec which_groups() -> [Group :: group()].

等效于 which_groups(pg)

链接到此函数

which_groups(Scope)

查看源代码 (自 OTP 23.0 起)
-spec which_groups(Scope :: atom()) -> [Group :: group()].

返回所有已知组的列表。