> On Jul 30, 2006, at 5:11 PM, Chris H wrote:
>
>> 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.
>
>
>
>
> Hey Chris-
>
>     By itself Backgroundrb won''t spawn any extra processes except
for
> itself. Are you doing a system call or using `` to call an external  
> program? Or are you using fork at all? Maybe if you paste your worker  
> code and how you are calling it here I can help you track down the  
> issue.
>
> -Ezra
>
Hi Ezra,
Sorry I''ve been a bit misleading.  When viewing top I had the processes
ordered by cpu % usage.  So when I ran my worker
it appeared at the top and then disappeared off the list once it was 
finished.
I''m not using a system call or any external program in my worker. 
It''s
main function is to read data from a file into a database.
I''ve been successful in getting the worker to stop now by adding a 
stop_work method to my worker which sets @running to false in the 
process_cdr class and causes the code in do_work to return.
My woker method stop_work calls processs_cdr.stop_process:
 def stop_work
   @process_cdr.stop_process
 end
 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
When @running is set to false the loop breaks and process() returns.
This is the main code from the process_cdr class:
 def stop_process
   @running = false
 end
 def process
   @running = true
   @time_start = Time.new.to_f
   @files_processed = 0
   phone_service_accounts = PhoneServiceAccount.find(:all)
   phone_service_accounts.each do |myPsa|       process_class_name = 
myPsa.process_class
     @current_account = myPsa.name
     if @file.strip.length == 0
       @phone_service_cdr = PhoneServiceCdr.find(:all, :conditions => 
"processed = ''n''")
     else
       @phone_service_cdr = PhoneServiceCdr.find(:all, :conditions => 
"processed = ''n'' AND
name=''#{@file}''")
     end
     @total_files = @phone_service_cdr.size.to_i         
@phone_service_cdr.each do |myPsc|             @current_file = myPsc.name
       @process_class = 
eval("#{process_class_name}.new(''#{CDR_DIRECTORY}#{myPsc.name}'')")
       finished_processing_cdr = false
       while(@running && !finished_processing_cdr)
         @process_class.process_records do |record|
           PhoneServiceRecord.new do |phone_service_record|
             phone_service_number = PhoneServiceNumber.find(:first, 
:conditions => "number =
''#{record[:charged_party]}''")
             customer_id = 0
             customer_id = phone_service_number.customer_id if 
phone_service_number != nil
             phone_service_record.date_time = record[:date_time]
             phone_service_record.duration = record[:duration]
             phone_service_record.originating_number = 
record[:originating_number]
             phone_service_record.terminating_number = 
record[:terminating_number]
             phone_service_record.charged_party = record[:charged_party]
             phone_service_record.currency = record[:currency]
             phone_service_record.wholesale_cost = record[:wholesale_cost]
             phone_service_record.customer_cost = record[:customer_cost]
             phone_service_record.distance = record[:distance]
             phone_service_record.is_local = record[:is_local]
             phone_service_record.type_of_call = record[:type_of_call]
             phone_service_record.rate_code = record[:rate_code]
             phone_service_record.batchname = record[:batchname]
             phone_service_record.customer_id = customer_id
             phone_service_record.phone_service_account_id = myPsa.id
             phone_service_record.save
           end
         end
         finished_processing_cdr = true
         @files_processed += 1
         myPsc.processed = ''y''
         #myPsc.save
       end
       return false if !@running
     end
   end
   @running = false   end
I''m not to sure if this is the correct way to go about stopping the 
worker.  How does this look to you?
Thanks in advance,
Chris.