Fun = fun() -> io:fwrite("~p starting...~n",[self()]), Res = jobs:dequeue(q, 3), io:fwrite("Res = ~p~n", [Res]) end, application:set_env(jobs, queues, [{pool, producer, Fun, [{regulators, [ {counter,[{limit,3}]} ]} ]}, {q, passive,[]}]). Here is a shell printout. No docs or eunit tests yet. The setup creates a pool of size 3, where the producer processes call jobs:dequeue(q, N). This function blocks if the queue is empty. When I put something in the queue, it is immediately forwarded to one of the waiting processes in the pool, which completes, terminates, letting the jobs_server spawn a new worker. If it is important to reuse worker processes, this could be done simply by letting the producer fun loop and repeatedly call dequeue/2. If it dies, a new worker is started, to ensure the pool is filled. You can only enqueue/dequeue to a passive queue. Any other type of queue will cause a badarg exception in the client. =PROGRESS REPORT==== 13-Jan-2011::10:34:32 === application: sasl started_at: nonode@nohost Eshell V5.8.1 (abort with ^G) 1> application:set_env(jobs, queues, [{pool, producer, fun() -> io:fwrite("~p starting...~n",[self()]), Res = jobs:dequeue(q, 3), io:fwrite("Res = ~p~n", [Res]) end, [{regulators, [{counter,[{limit,3}]}]}]}, {q, passive,[]}]). ok 2> application:start(jobs). =PROGRESS REPORT==== 13-Jan-2011::10:34:44 === supervisor: {local,jobs_app} started: [{pid,<0.47.0>}, {name,jobs_server}, {mfargs,{jobs_server,start_link,[]}}, {restart_type,permanent}, {shutdown,3000}, {child_type,worker}] <0.48.0> starting... <0.49.0> starting... <0.50.0> starting... ok 3> =PROGRESS REPORT==== 13-Jan-2011::10:34:44 === supervisor: {local,kernel_safe_sup} started: [{pid,<0.52.0>}, {name,timer_server}, {mfargs,{timer,start_link,[]}}, {restart_type,permanent}, {shutdown,1000}, {child_type,worker}] =PROGRESS REPORT==== 13-Jan-2011::10:34:44 === supervisor: {local,jobs_app} started: [{pid,<0.51.0>}, {name,jobs_sampler}, {mfargs,{jobs_sampler,start_link,[]}}, {restart_type,permanent}, {shutdown,3000}, {child_type,worker}] =PROGRESS REPORT==== 13-Jan-2011::10:34:44 === application: jobs started_at: nonode@nohost 3> jobs:enqueue(q, job1). ok Res = [{36911304349436,job1}] 4> <0.55.0> starting... 4> jobs:enqueue(q, job2). ok Res = [{36911308613434,job2}] 5> <0.58.0> starting...