[erlang-questions] queue process with capacity

Dmitry Kolesnikov dmkolesnikov@REDACTED
Thu Mar 2 17:16:33 CET 2017


Hello,

There are multiple Erlang project that provides necessary queuing features. You can google them with “erlang simple queue”

The gen_server callback supplies you a From entity. This is a “channel” to acknowledge request processing. You queue this entity internally and uses gen_server:reply(…) to acknowledge consumer/producer when it’s request is completed.  
```
Module:handle_call(Request, From, State) -> Result

http://erldocs.com/19.0/stdlib/gen_server.html?i=13&search=gen_server#reply/2
http://erldocs.com/19.0/stdlib/gen_server.html?i=4&search=gen_server#call/3
```

Here is a sketch of the code
```
handle_call(dequeue, From, #state{q = Q} = State) ->
  {noreply, State#state{q = queue:in(From, Q)}};

handle_call({enqueue, X}, _, #state{q = Q} = State) ->
   gen_server:reply(queue:head(Q), X),
   ...
```

I hope you got an implementation idea. 
Please let me know if more info is needed

Best Regards, 
Dmitry Kolesnikov | Digital Cossack
dmkolesnikov@REDACTED



> On Mar 2, 2017, at 4:44 PM, semmit mondo <semmitmondo@REDACTED> wrote:
> 
> Hi,
>  
> I need to implement a queue service that has a capacity.  This means that the `in` actions has to be able to block the producer when the queue is full, and also the `out` action has to be able to block the consumer when the queue is empty.
>  
> Sending in an item and then receiving with "after infinity" in the producer seems to be a working approach.  But my concern is that this way the producer process is blocked and so it is unable to respond to any system messages.  If I do this in a supervised process, do I break the contract between OTP and that process?  Aren't all the processes supposed to answer certain low level messages that is handled by gen_server without me to even know about?  Shouldn't supervised processes be blocked only in the gen_server's main receive loop?
>  
> I feel that receiving indefinitely is something I should avoid.  But how can I implement the queue in an OTP friendly way?
>  
> S.
>  
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions




More information about the erlang-questions mailing list