檢視原始碼 pg (核心 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
將會有完整的視圖。
當任何程序加入時,群組會自動建立,而當所有程序離開群組時,群組會被移除。不存在的群組會被視為空的(不包含任何程序)。
程序群組可以組織成多個範圍。範圍彼此完全獨立。一個程序可以加入任何數量範圍中的任何數量群組。範圍旨在將單一網格解耦為一組覆蓋網路,減少傳播群組成員資格資訊所需的流量。當 核心設定為執行此操作時,預設範圍 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)
。
傳回所有已知群組的清單。