[Backgroundrb-devel] MY worker won't stop working
Chris H
chris at etechdata.com.au
Sun Jul 30 20:11:04 EDT 2006
Hi Ezra,
thanks for the reply.
There's a ruby process that appears in top when I fire off the do_work
method.
It uses around 30-50% cpu and disappears once all processing has completed.
When I try to stop processing using delete_worker I was expecting this
ruby process to stop,
but understand/expect that backgroundrb is still running.
I tried
MiddleMan[:process_watcher].terminate && MiddleMan.delete_worker
(:process_watcher)
however this seems to do less then MiddleMan.delete_worker
(:process_watcher) on its own.
As Michael Siebert wrote, will I need to have do_work return when I want
my process to stop?
Thanks in advance,
Chris.
> Hi~
>
> On Jul 24, 2006, at 11:25 PM, Chris H wrote:
>
>> Hi Ezra,
>>
>> love backgroundrb! Awesome plugin!
>
>
> Thanks!
>
>>
>> I have a worker that processes some data files and loads this data
>> in mysql.
>> It runs fine and processes all the files.
>>
>> However if I try to call delete_worker from my controller while it is
>> processing ,
>> it says it has stopped the worker but I can still see the process
>> in top and also see the rows still going into mysql.
>>
>>
>> My do_work looks like this:
>>
>> def do_work(args)
>> # This method is called in it's own new thread when you
>> # call new worker. args is set to :args
>> if args
>> @process_cdr = ProcessCdr.new(args)
>> else
>> @process_cdr = ProcessCdr.new
>> end
>> @process_cdr.process
>>
>> end
>>
>> I have start and stop actions in my controller:
>>
>> def start
>>
>> if @params[:cdr_file].to_s.length > 0
>>
>> MiddleMan[:process_watcher] ||MiddleMan.new_worker(:class =>
>> :watch_cdr_process_worker, :args => @params [:cdr_file].to_s,
>> :job_key =>
>> :process_watcher)
>>
>> else
>>
>> MiddleMan[:process_watcher] || MiddleMan.new_worker(:class =>
>> :watch_cdr_process_worker, :job_key => :process_watcher)
>>
>> end
>>
>> redirect_to :action => 'status'
>>
>> end
>>
>> def stop
>>
>> MiddleMan.delete_worker(:process_watcher) if MiddleMan
>> [:process_watcher]
>
>
> Middleman[:process_watcher].terminate && MiddleMan.delete_worker
> (:process_watcher)
>
>
>> redirect_to :action => 'status'
>>
>> end
>>
>> I have some ajax code monitoring the status of my worker and when I
>> choose stop it responds that my worker has indeed stopped.
>>
>> I also tried adding a method stop_work to my worker which called
>> self.terminate but this didn't seem to work either.
>>
>> I'm confused as to what I should be doing to get my worker to stop.
>>
>> Thanks in advance,
>> Chris.
>
>
> Chris-
>
> When you say you can see the process in top still what do you
> mean? Killing one worker will not stop the whole backgroundrb process
> so it will still show in top. The way terminate works is that you
> call it and it will signal the thread handle that it is ok to delete
> this worker. THen delete_worker will actually delete it. The next
> release will have a method you can use in your worker to kill it from
> within itself when its finished.
>
> See if using terminate this way works for you and let me know.
>
> Thanks
> -Ezra
>
>
>
>
>
More information about the Backgroundrb-devel
mailing list