[erlang-questions] gproc

Ulf Wiger ulf.wiger@REDACTED
Sun Feb 13 08:54:11 CET 2011


On 12 Feb 2011, at 20:35, James Churchman wrote:

> haves as ets:first(Tab) for a given type of registration object.
> 
> See http://www.erlang.org/doc/man/ets.html#first-1. The registry behaves as an ordered_set table.
> 
> -------
> 
> Why does it behave as an ordered set? does this have any advantages ? i see with select/123 you can pattern match but even in this case does it help much ? and does begin ordered strongly effect performance, especially as i am only ever using it as a (single) process registry? can you pick an unordered set if you don't need it?

Actually, gproc relies on the ordered_set semantics in several places, not least when cleaning up after process death. It is possible that one could slightly improve performance using bag semantics, but then, having ordered_set semantics allows users to register complex properties, and do efficient queries on them (by binding the first part of the key).

Performance of ordered_set is quite good; I did use initial tests with 100,000 registered processes, and was quite pleased with how it scaled.

> "Second" :
> 
> I want to do a fairly common pattern of registering a process and using it, unless its already registered where i use the registered one
> 
> so for a local registration : 
> 
> gproc:reg({n, l,"ID"}).
> 
> however on a second (and therefor "failing" ) registration it gives 
> 
> exception error: bad argument: [{gproc,chk_reply,{reg,{n,l,ok2},undefined}},         {erl_eval,do_apply,5},     {shell,exprs,7},     {shell,eval_exprs,7},      {shell,eval_loop,3}]
> 
> i can obviously catch this, but it would be nicer if it did the genserver style of returning {error , already_exists , PID / Value_Stored_At_That_Key}

Hmm, one way you could do this would be:

get_pid(Name, F) ->
   spawn(fun() ->
                    gproc:add_local_name(Name),
                    F()
                end),
    gproc:await({n,l,Name}).

…or did you want a function similar to wait, where the calling process registers itself if there isn't already a process registered?

BR,
Ulf W

Ulf Wiger, CTO, Erlang Solutions, Ltd.
http://erlang-solutions.com





More information about the erlang-questions mailing list