作用域组长是现有组长机制的扩展,允许将组长机制用于其原始意图(仅用于 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.
此函数将进程 Proc
的作用域 Scope
的组长设置为 GroupLeader
。现有函数 erlang:group_leader/2
现在实现为
erlang:group_leader(io, GroupLeader, Proc)
通过 erlang:process_info/1
和 erlang:process_info/2
获取的进程信息已扩展为一个新键 group_leaders
。 它包含与给定进程关联的组长属性列表。 该列表至少包含元组 {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
返回的属性列表具有所有预先存在的键保持不变,并新增了一个名为 group_leaders
的键。 如果存在依赖于此属性列表中使用的特定键集的代码,则应该不会存在向后兼容性问题。
目前没有参考实现。但是,概念验证实现可用。
本文档已置于公共领域。