[erlang-questions] Is using gen_server behaviour appropriate for his usecase?

Garrett Smith g@REDACTED
Sun Dec 2 18:41:17 CET 2012


I'm not advocating that one should use proc_lib/gen_server facilities
blindly -- or incorrectly :)

The OP asked about roll-your-own message loops vs OTP -- and I'd cite
that as an example of why we should teach OTP as fundamental to
correct Erlang application development.

My motivation for writing e2 was that I observed new users struggling
with the complexity of the gen_server interface (primarily) and, given
the importance of it, wanted to make it easier to use correctly.

But, as you suggest, we should perhaps talk more about proc_lib and
how to use it when you're tempted to otherwise run a process outside
OTP facilities.

On Sat, Dec 1, 2012 at 8:27 PM, Robert Virding
<robert.virding@REDACTED> wrote:
> Sorry, I don't agree with you here. While using OTP is generally a Good Thing, using OTP because you know WHY you need to use use it is a Much Much Much Better Thing! You see cases of where people have blindly used gen_servers then struggle and produce convoluted code to get around the very features which gen_servers provide. So I would say that you should know what the basic Erlang provides and how you use it, know what OTP provides and how you use it and choose that which is closest to what you need.
>
> I am not saying that you shouldn't use OTP, I am saying you should know why you are using OTP.
>
> Actually it is not very difficult to roll your own processes which fit into OTP supervision trees. It is done using the proc_lib and sys modules and it describe quite well here http://www.erlang.org/doc/design_principles/spec_proc.html .
>
> Robert
>
> ----- Original Message -----
>> From: "Garrett Smith" <g@REDACTED>
>> To: "Vineet Naik" <naikvin@REDACTED>
>> Cc: erlang-questions@REDACTED
>> Sent: Friday, 30 November, 2012 2:48:54 PM
>> Subject: Re: [erlang-questions] Is using gen_server behaviour appropriate for his usecase?
>>
>> Roman is spot on correct.
>>
>> There's a school of thought that says new developers should learn
>> core
>> Erlang and master it before tackling OTP. IMHO this is wrong. OTP
>> *is*
>> core Erlang at this point.[1]
>>
>> Just use OTP, right away. If the many moving parts of the standard
>> OTP
>> behaviors seems like a steep learning curve, take a look at e2:
>>
>> http://e2project.org
>>
>> e2 is a veneer on top of OTP that, at least in my opinion (I wrote it
>> for this reason :) makes canonical development a lot easier. You
>> might
>> start by reading/following the tutorial:
>>
>> http://e2project.org/tutorial.html
>>
>> The tutorial has more to do with general application development in
>> Erlang than it does in with the specifics of the e2 library.
>>
>> Garrett
>>
>> [1] There's a long history of Erlang that separates the core from
>> OTP.
>> I understand how books, tutorials, teaching philosophies, and common
>> wisdom would treat OTP as an advanced topic. But as a relative
>> newcomer to Erlang, not having any historical context, etc. I found
>> this treatment unhelpful in my own learning. IMO "gen_server" (e2
>> calls these "services" and "tasks" depending on the scenario) is a
>> starting point, after one has learned the basics of the language
>> itself.
>>
>> On Fri, Nov 30, 2012 at 2:36 AM, Roman Gafiyatullin
>> <r.gafiyatullin@REDACTED> wrote:
>> > Hi,
>> >
>> > In most of the cases one shall not use "simple loop functions": raw
>> > process
>> > cannot participate properly in the supervision tree.
>> >
>> > If you need some new tricky specific model of behaving - better
>> > implement it
>> > over gen_server.
>> > For instance supervisor is a gen_server :)
>> >
>> > If you need something more low level - use 'gen' module (see how
>> > gen_fsm is
>> > implemented).
>> >
>> > --
>> > Regards
>> > RG ( +375 33 602 5080, UTC+3 )
>> >
>> > On Friday, November 30, 2012 at 11:25 am, Vineet Naik wrote:
>> >
>> > Hello,
>> >
>> > I am an Erlang newbie and trying to write a simple chat bot as an
>> > XMPP external component. I am using exmpp library and following
>> > along these tutorials[1]
>> >
>> > So far I have one module `bot_server` that uses the gen_server
>> > interface. Inside it's `handle_info` callback, incoming messages
>> > from various client will be received. To handle and reply to the
>> > these messages, I am thinking of spawning a "bot" process per
>> > client. It will stay alive as long as the client is available
>> > ie. when the client sends "unavailable" presence, it will die. I
>> > also need to keep a list of all the alive bot processes in the
>> > bot_server's state.
>> >
>> > My question is, would it be appropriate to implement the bot as a
>> > gen_server too considering that it needs to handle two calls, one
>> > for handling incoming message (asynchronous) and second for
>> > killing itself (synchronous)?
>> >
>> > In general, when should one use gen_server and when should
>> > one write a simple loop function?
>> >
>> > [1] exmpp tutorials:
>> > http://blog.process-one.net/scalable_xmpp_bots_with_erlang_and_exmpp_part_i/
>> >
>> > Thanks,
>> > Vineet
>> > _______________________________________________
>> > erlang-questions mailing list
>> > erlang-questions@REDACTED
>> > http://erlang.org/mailman/listinfo/erlang-questions
>> >
>> >
>> >
>> > _______________________________________________
>> > erlang-questions mailing list
>> > erlang-questions@REDACTED
>> > http://erlang.org/mailman/listinfo/erlang-questions
>> >
>> _______________________________________________
>> erlang-questions mailing list
>> erlang-questions@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-questions
>>



More information about the erlang-questions mailing list