Extended process registry for Erlang
Erlang CSS
Pull request Compare This branch is 2 commits ahead, 70 commits behind uwiger:master.
Latest commit 1f12fbf Jun 5, 2014 @uwiger uwiger Merge pull request #10 from whisperheart/patch-1
Cannot unregister a global property
Failed to load latest commit information.
doc add monitor(Key, follow), bug fixes for standby Mar 14, 2014
ebin Add ebin/.gitignore May 24, 2013
include Fix dist update_counter() bug, add gproc_ps module, add update_counte… Feb 29, 2012
patches restructuring Mar 17, 2009
reference added rebar support Sep 11, 2010
src Cannot unregister a global property Jun 5, 2014
test add monitor(Key, follow), bug fixes for standby Mar 14, 2014
tetrapak Fixed tupo. Jan 11, 2013
.gitignore don't ignore ebin/ (may interfere with -include_lib) May 24, 2013
LICENSE Added license file Dec 3, 2012
LICENSE.txt added EPL 1.1 LICENSE.txt Dec 20, 2012
Makefile updated make doc target Jan 11, 2013
README.md first impl. of standby monitors Mar 9, 2014
rebar New rebar with REBAR_DEPS_DIR Jul 2, 2013
rebar.config dynamic deps handling, fixed deps Jan 11, 2013
rebar.config.script rebar.config.script was only a symlink Jan 11, 2013


The gproc application

Authors: Ulf Wiger (ulf.wiger@erlang-solutions.com), Joseph Wayne Norton (norton@geminimobile.com).

Extended process dictionary


Gproc has two dependencies: gen_leader and edown. Since most people don't actively use either, they are no longer fetched by default.

  • To enable fetching of gen_leader, export the OS environment variableGPROC_DIST=true (this can be done e.g. from a GNU Makefile)

  • edown is fetched on-demand whenver rebar get-deps doc is called (which happens when you call make doc)


Gproc is a process dictionary for Erlang, which provides a number of useful features beyond what the built-in dictionary has:

  • Use any term as a process alias

  • Register a process under several aliases

  • Non-unique properties can be registered simultaneously by many processes

  • QLC and match specification interface for efficient queries on the dictionary

  • Await registration, let's you wait until a process registers itself

  • Atomically give away registered names and properties to another process

  • Counters, and aggregated counters, which automatically maintain the total of all counters with a given name

  • Global registry, with all the above functions applied to a network of nodes

Use case: System inspection

Gproc was designed to work as a central index for "process metadata", i.e. properties that describe the role and characteristics of each process. Having a single registry that is flexible enough to hold important types of property makes it easier to (a) find processes of a certain type, and (b) query and browse key data in a running system.

Use case: Pub/Sub patterns

An interesting application of gproc is building publish/subscribe patterns. Example:

subscribe(EventType) ->
    %% Gproc notation: {p, l, Name} means {(p)roperty, (l)ocal, Name}
    gproc:reg({p, l, {?MODULE, EventType}}).

notify(EventType, Msg) ->
    Key = {?MODULE, EventType},
    gproc:send({p, l, Key}, {self(), Key, Msg}).

Use case: Environment handling

Gproc provides a set of functions to read environment variables, possibly from alternative sources, and cache them for efficient lookup. Caching also provides a way to see which processes rely on certain configuration values, as well as which values they actually ended up using.

See gproc:get_env/4, gproc:get_set_env/4 and gproc:set_env/5 for details.


Gproc has a QuickCheck test suite, covering a fairly large part of the local gproc functionality, although none of the global registry. It requires a commercial EQC license, but rebar is smart enough to detect whether EQC is available, and if it isn't, the code in gproc_eqc.erl will be "defined away".

There is also an eunit suite, covering the basic operations for local and global gproc.

Building Edoc

By default, ./rebar doc generates Github-flavored Markdown files. If you want to change this, remove the edoc_opts line from rebar.config. Gproc was first introduced at the ACM SIGPLAN Erlang Workshop in Freiburg 2007 (Paper available here).