<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EstiloCorreo17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:612.0pt 792.0pt;
        margin:70.85pt 3.0cm 70.85pt 3.0cm;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=ES link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Regards, James, I think using queue module from otp and gen_server
behavior, maintaining the Queue in the state, would help you to implement
something like that. queue module have many interesting APIs that will do the
job for you very faster. Just remember not to use queue:len/1 or any other O(n)
order function  if you don´t  need it, for len you can just keep it in track in
the gen_server state along with  the queue. NOTE: some of the queue APIs,
throws exceptions, use the simple API if you don want to handle exceptions.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Ie:<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Init([])-><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>      {ok, {queue:new(), 0}}.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Handle_call({push, Item}, _From, {MyQueue, Len})<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>    {reply, ok, {queue:in(Item, MyQueue), Len + 1}}<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Handle_call(pop, _From, {MyQueue, Len})<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>    case queue:out(MyQueue) of<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>        {{value, Item}, Q} -><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>           {reply, Item, {Q, Len - 1}}<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>        {empty, Q} -><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>           {reply, no_item, {Q, Len}}<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>If you want to retrieve some specific item you can always use
queue:filter/2 function instead.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Something like this:<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>pop_item(Item, Queue)-><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>    queue:filter(fun(I)-> I =/= Item end, Queue).<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>but that is function of order O(n) so…<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'> <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>NOTE: I just wrote  the example without testing it, so I
apologize for any mistake. <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Best regards,<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Ivan.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p> </o:p></span></p>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>

<p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:
"Tahoma","sans-serif"'>De:</span></b><span lang=EN-US style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'> erlang-questions-bounces@erlang.org
[mailto:erlang-questions-bounces@erlang.org] <b>En nombre de </b>We</span><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>s James<br>
<b>Enviado el:</b> jueves, 30 de julio de 2015 15:02<br>
<b>Para:</b> avinash D'silva<br>
<b>CC:</b> erlang-questions@erlang.org<br>
<b>Asunto:</b> Re: [erlang-questions] Need some advice on implementing a Queue
Server<o:p></o:p></span></p>

</div>

<p class=MsoNormal><o:p> </o:p></p>

<div>

<div>

<div>

<p class=MsoNormal style='margin-bottom:12.0pt'><br>
<br>
On Thu, Jul 30, 2015 at 12:22 PM, avinash D'silva <<a
href="mailto:evnix.com@gmail.com">evnix.com@gmail.com</a>> wrote:<br>
><br>
> Hi,<br>
><br>
> I am trying to learn Erlang by implementing a small Queueing Server.<br>
><br>
> What have I done so far?<br>
> I have created a basic websocket server using cowboy.<br>
><br>
> I am trying to implement a Queue which all processes can access.<br>
><br>
> I have used lists which can act as queues.<br>
><br>
> The basic insert function looks like this:<br>
> Queue(Q) -><br>
>         receive <br>
>                Msg -><br>
>                    
Queue(lists:append(Q,[Msg]))<br>
>         end.       <br>
><br>
> To create a Queue called "Q_1"<br>
><br>
> >  pg2:create(<<"Q_1">>).<br>
> >  P = spawn(test,Queue,[[1]]). % spawn queue and insert 1.<br>
> >  pg2:join(<<"Q_1">>,P).<br>
> >  P ! 2.<br>
> >  P ! 3. % add some elements to queue.<br>
><br>
> to retrieve the elements from the named Queue "Q_1":<br>
> 1. I use [Px|_]=pg2:get_members()<br>
> 2. then I would do something like: Px ! POP_ELEMENT<br>
><br>
><br>
> Is there a better or more scalable way of doing this?<br>
><br>
> Will this work when a lot of clients are connected( around 60), having a
insert rate of 100k elements per hour?<br>
><br>
> Any help is appreciated :)<br>
><br>
<br>
I did a search on yahoo for "erlang queue example" and this was the
first hit:<br>
<br>
<a href="http://www.erlang.org/doc/man/queue.html">http://www.erlang.org/doc/man/queue.html</a><o:p></o:p></p>

</div>

<p class=MsoNormal style='margin-bottom:12.0pt'>There were several other
examples that might help.<o:p></o:p></p>

</div>

<p class=MsoNormal>-wes<o:p></o:p></p>

<div>

<div>

<p class=MsoNormal><br>
 <o:p></o:p></p>

</div>

</div>

</div>

</div>

</body>

</html>