[erlang-questions] Stopping gen_server during processing

aman mangal <>
Fri Nov 8 10:51:56 CET 2013


Hi,

What you want is something like Interrupts. I don't think Erlang processes
have interrupts. So there is no easy solution. But you can do it using
message passing which will require multiple processes.

To elaborate, you create another process to check records while this
process waits for more messages. When you receive a stop message, you kill
the process who is checking for records. On the other hand, if the process
is done executing (i.e. done checking records) it simply sends a success
message to the parent process.

You can read more here
http://stackoverflow.com/questions/10219058/interrupting-a-process-in-erlang

Aman Mangal
4th year Undergraduate Student
Department of Computer Science & Engineering
IIT Bombay
www.cse.iitb.ac.in/~amanmangal


On Fri, Nov 8, 2013 at 3:13 PM, Janos Hary <> wrote:

> Sorry, I cannot see how could it work in Erlang.
>
> I have a handle_info processing a large number of records:
> handle_info(check, State) ->
>         check_records(State).
>
> check_records(State) ->
>         do some work...
>         case State#stop_flag of
>                 true ->
>                         {stop, normal, State};
>                 _ ->
>                         check_records(State)
>         end.
>
> The State in check_records cannot changed from another cast. I'm not even
> sure that the cast will execute before check_records finishes.
>
> Janos
>
>
> -----Original Message-----
> From: 
> [mailto:] On Behalf Of Bengt Kleberg
> Sent: Friday, November 08, 2013 9:28 AM
> To: undisclosed-recipients:
> Cc: 
> Subject: Re: [erlang-questions] Stopping gen_server during processing
>
> These are my opinions, not hard facts.
>
> Add a member to the gen_server state record that says that you are going to
> stop when possible. Use a cast to set it to true when you want to stop. If
> it is true and you can stop the gen_server, stop it.
>
>
> bengt
>
> On Fri, 2013-11-08 at 08:55 +0100, Janos Hary wrote:
> > All,
> >
> >
> >
> > I have a gen_server process which periodically processes new records
> > from a database. I use timer:send_after to schedule gathering and
> > processing new records. I can gracefully stop the gen_server when it
> > is waiting, but I need a way to stop it during processing. Of cause I
> > only want to stop it at certain points of the processing, for example
> > before starting to process the next record. I need to group the
> > records, so I cannot ask them one by one from the db.
> >
> >
> >
> > What is the preferred way of doing this?
> >
> >
> >
> > Thanks for your answers in advance.
> >
> > Janos
> >
> >
> > _______________________________________________
> > erlang-questions mailing list
> > 
> > http://erlang.org/mailman/listinfo/erlang-questions
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20131108/669e05bd/attachment.html>


More information about the erlang-questions mailing list