檢視原始碼 pg (核心 v10.2)

分散式命名程序群組。

此模組實作程序群組。訊息可以被傳送到一個、一些或所有群組成員。

在 OTP 17 之前,stdlib 中曾經存在一個實驗性的 pg 模組。這個 pg 模組與該實驗性的 pg 模組不是同一個模組,僅共用相同的模組名稱。

一組程序可以透過一個通用名稱來存取。例如,如果有一個名為 foobar 的群組,則可能有一組程序(可以位於不同的節點上)都是 foobar 群組的成員。沒有特殊的功能可以將訊息傳送到群組。相反地,應該使用函式 get_members/1get_local_members/1 來編寫用戶端函式,以確定哪些程序是群組的成員。然後,訊息可以傳送到一個或多個群組成員。

如果成員終止,它會自動從群組中移除。

一個程序可以加入多個群組。它可以多次加入同一個群組。它只允許加入在本地節點上執行的程序。

程序群組實作強最終一致性。程序群組成員資格視圖可能會暫時產生分歧。例如,當 node1node2 上的程序同時加入時,node3node4 可能會以不同的順序接收更新。

成員資格視圖不是可傳遞的。如果 node1 沒有直接連線到 node2,它們將看不到彼此的群組。但是,如果它們都連線到 node3node3 將會有完整的視圖。

當任何程序加入時,群組會自動建立,而當所有程序離開群組時,群組會被移除。不存在的群組會被視為空的(不包含任何程序)。

程序群組可以組織成多個範圍。範圍彼此完全獨立。一個程序可以加入任何數量範圍中的任何數量群組。範圍旨在將單一網格解耦為一組覆蓋網路,減少傳播群組成員資格資訊所需的流量。當 核心設定為執行此操作時,預設範圍 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()].

傳回所有已知群組的清單。