4.2.17. gproc¶
网站 [1]
Erlang 进程注册机制目前的限制是:
names只能是atom
一个进程只能注册一个name
不能进行高效的搜索和遍历,进程信息的检索是通过遍历检查进程的元数据完成的.
Gproc是Erlang进程注册机制的加强版,提供了如下原生进程注册没有的功能:
使用任意Erlang Term作为进程的别名
一个进程注册多个别名
支持QLC和match specification高效查询
自动移交已经注册的names和属性到另外的进程
ets表:
gproc
gproc_monitor
get_attribute/2/3¶
结构:
get_attribute(Key, Attr::atom()) -> Value
get_attribute(Key, Pid::pid() | shared, Attr::atom()) -> Value
lookup_values/1¶
实例:
gproc:lookup_values({p,l,Name})
reg/1/2/3¶
结构:
reg(Key::key()) -> true
等同于: reg(Key, default(Key), []).
reg(Key::key(), Value::value()) -> true
等同于: reg(Key, Value, []).
reg(Key::key(), Value::value(), Attrs::attrs()) -> true
类型:
Key:: {Type, Context, Name}
Type :: p | n | c | a | r | rc
Context :: l | g
说明:
l:local
g:global
--
p - 'property',非唯一,不同进程可以注册相同的名字
n - 'name',指定上下文是唯一的
c - 'counter',类似property,数值,大体类似ets计数器
a - 'aggregated counter',汇总计数器,由gproc自动更新,指定范围内所有相同名称计数器的总和.
r - 'resource property',类似property,可通过'resource counter'追踪
rc - 'resource counter',追踪相同名称的资源属性数量.当计数为0时,可以执行有on_zero属性指定的任何触发器
On-zero triggers:
Msg = {gproc, resource_on_zero, Context, Name, Pid}
{send, Key} - run gproc:send(Key, Msg)
{bcast, Key} - run gproc:bcast(Key, Msg)
publish - run gproc_ps:publish(Context, gproc_resource_on_zero, {Context, Name, Pid})
{unreg_shared, Type, Name} - unregister the shared key {Type, Context, Name}
实例:
gproc:reg({p, l, "Shell"}).
gproc:reg({p, l, Name}, Port).
send/2¶
结构:
send(Key::process() | key(), Msg::any()) -> Msg
说明:
发送消息给Key相关的指定1个或多个进程
实例:
gproc:send({p,l,"Shell"}, dvd).