作用域群組領導者是對現有群組領導者機制的一種擴展,允許在原始用途(僅限於 I/O)之外使用群組領導者機制。
每個程序都有一個群組領導者的「字典」,預設定義一個 io
群組領導者,代表目前 Erlang 中唯一存在的群組領導者。每個建立的程序都會獲得字典的副本,與之前完全相同。
erlang
模組中增加了兩個新函數。
首先,是作用域群組領導者檢索
erlang:group_leader(Scope :: atom()) -> 'undefined' | pid()
此函數會檢索範圍 Scope
的群組領導者。現有的無引數函數 erlang:group_leader/0
現在實作為
erlang:group_leader(io)
其次,是作用域群組領導者設定
erlang:group_leader(Scope :: atom(), GroupLeader :: pid(),
Proc :: pid()) -> true.
此函數將範圍 Scope
的群組領導者設定為程序 Proc
的 GroupLeader
。現有的函數 erlang:group_leader/2
現在實作為
erlang:group_leader(io, GroupLeader, Proc)
透過 erlang:process_info/1
和 erlang:process_info/2
提供的程序資訊已擴展了一個新鍵 group_leaders
。它包含與給定程序相關的群組領導者 proplist。此列表至少會包含元組 {io, <0.24.0>}
。 注意:此群組領導者目前是每個程序中的預設群組領導者。
分配機制也將擴展以支援這些作用域群組領導者,因此在遠端節點上產生的程序也會複製整個群組領導者列表。
在此範例中,我們將為 test
範圍設定群組領導者,並從目前程序和子程序中檢索它。此外,我們將使用原始 API 和新的 API 檢索 io
作用域群組領導者
1> erlang:group_leader(test, self(), self()).
true
2> erlang:group_leader().
<0.24.0>
3> erlang:group_leader(io).
<0.24.0>
4> erlang:group_leader(test).
<0.31.0>
5> spawn(fun() -> io:format("~p~n",[erlang:group_leader()]) end), ok.
<0.24.0>
ok
6> spawn(fun() -> io:format("~p~n",[erlang:group_leader(io)]) end), ok.
<0.24.0>
ok
7> spawn(fun() -> io:format("~p~n",[erlang:group_leader(test)]) end), ok.
<0.31.0>
ok
8> spawn(fun() -> io:format("~p~n",[erlang:process_info(self())]) end), ok.
[{current_function,{erl_eval,do_apply,5}},
{initial_call,{erlang,apply,2}},
{status,running},
{message_queue_len,0},
{messages,[]},
{links,[]},
{dictionary,[]},
{trap_exit,false},
{error_handler,error_handler},
{priority,normal},
{group_leader,<0.24.0>},
{group_leaders,[{test,<0.31.0>},{io,<0.24.0>}]},
{total_heap_size,233},
{heap_size,233},
{stack_size,24},
{reductions,93},
{garbage_collection,[{min_bin_vheap_size,46368},
{min_heap_size,233},
{fullsweep_after,65535},
{minor_gcs,0}]},
{suspending,[]}]
ok
I/O 系統不是唯一能方便使用群組領導者概念的領域。隱式組態、安全群組和許多其他問題都可以透過擴展標準群組領導者機制而受益。
此技術的潛在用途之一是將 I/O 領導者範式擴展到 Web 開發,其中 web
群組領導者表示為 HTTP 連線、WebSocket 或會話。使用這種簡單的方法,可以利用 I/O 原語使用的相同技術,允許透明和/或多工存取本地或遠端程序中的其他 HTTP 通訊通道。
我們選擇擴展現有的 API,而不是引入新的 API,因為我們認為這個概念是人們已經熟悉的群組領導者概念的自然演變。
所提出的變更保持現有的 API 不變,並且僅為此預先描述的功能提供一些新函數。雖然此變更保持回溯相容性,但現有的行為不會改變,並且新引入的行為會被塑造成模仿現有的行為。
erlang:process_info/1
傳回的 Proplist 具有所有未修改的預先存在的鍵和功能,並新增了一個名為 group_leaders
的新鍵。在不太可能發生程式碼依賴於此 proplist 中使用的特定鍵集的情況下,應該不存在回溯相容性問題。
目前沒有參考實作。但是,概念驗證實作是 可用的。
本文件已置於公有領域。