Greetings, I''ve got a rails app which is basically an admin interface to a xml dataset. Currently I''ve got rails rigged to call a function to spit the entire dataset to file with every change. This would actually be ok, its fairly infrequently updated, but when the dataset grows large the user sits there waiting for it to dump with no feedback as to whats going on. Oh yes, nearly forgot; I''m on Lighttpd with FastCGI. I was thinking maybe just maybe I could dump to file after doing the render() or redirect_to() calls and perhaps the client would get their response before the method call terminated, that perhaps the render() / redirect_to() was actually ther response being sent. I''m pretty sure the this is wrong, that the method call termiantion signals the response to client, but I got a very odd error when I tried it; ActionController::DoubleRenderError (Can only render or redirect once per action): /vendor/rails/actionpack/lib/action_controller/base.rb:591:in `render_with_no_layout'' /vendor/rails/actionpack/lib/action_controller/layout.rb:228:in `render_without_benchmark'' /vendor/rails/actionpack/lib/action_controller/benchmarking.rb:53:in `render'' /usr/lib/ruby/1.8/benchmark.rb:293:in `measure'' /vendor/rails/actionpack/lib/action_controller/benchmarking.rb:53:in `render'' /vendor/rails/actionpack/lib/action_controller/base.rb:636:in `render_to_string'' I use render_to_string(:partial => ''datapoint'') to render the individual datapoints; whats odd is that render_to_string isnt working after redirect_to and render(). If I move the data-dump before these, it works fine and no errors appear. But whatever, although the error is just plain wrong and should not happen(there''s no reason rener_to_string should stop working after redirect_to or render), I''m pretty sure it wouldnt fix anything even if it was working. Anyways, I gotta do something. I''ve really got two key important factors; #1 the user needs to not have to wait while data gets dumped, they should get their response instantaneously #2 the data dump must occur ASAP. Even a 1 minute delay is not acceptable, so no Cron. Thanks! Rektide "CronHater" -------------- next part -------------- An HTML attachment was scrubbed... URL: wrath.rubyonrails.org/pipermail/rails/attachments/20060220/17e7e749/attachment.html
Rektide- This looks like a job for ruby threads. If you do it like this the thread will run to completion in the background and your method will continue right away onto the rest of its body and render or redirect_to calls. def foo_action Thread.new { xml = render_to_string(:partial => ''datapoint'') File.open("#{RAILS_ROOT}/public/ xml_files/data.xml", "w+"){ |f| f.write(xml) } } #now you can render or redirect_to and your file will #get written to disk in the backgroundconcurrently redirect_to :controller => ''foo'', :Action => ''bar'' end Cheers- -Ezra On Feb 19, 2006, at 7:39 PM, Matthew Fowle wrote:> Greetings, > > I''ve got a rails app which is basically an admin interface to a xml > dataset. Currently I''ve got rails rigged to call a function to > spit the entire dataset to file with every change. This would > actually be ok, its fairly infrequently updated, but when the > dataset grows large the user sits there waiting for it to dump with > no feedback as to whats going on. Oh yes, nearly forgot; I''m on > Lighttpd with FastCGI. > > I was thinking maybe just maybe I could dump to file after doing > the render() or redirect_to() calls and perhaps the client would > get their response before the method call terminated, that perhaps > the render() / redirect_to() was actually ther response being > sent. I''m pretty sure the this is wrong, that the method call > termiantion signals the response to client, but I got a very odd > error when I tried it; > > ActionController::DoubleRenderError (Can only render or redirect > once per action): > /vendor/rails/actionpack/lib/action_controller/base.rb:591:in > `render_with_no_layout'' > /vendor/rails/actionpack/lib/action_controller/layout.rb:228:in > `render_without_benchmark'' > /vendor/rails/actionpack/lib/action_controller/benchmarking.rb: > 53:in `render'' > /usr/lib/ruby/1.8/benchmark.rb:293:in `measure'' > /vendor/rails/actionpack/lib/action_controller/benchmarking.rb: > 53:in `render'' > /vendor/rails/actionpack/lib/action_controller/base.rb:636:in > `render_to_string'' > > I use render_to_string(:partial => ''datapoint'') to render the > individual datapoints; whats odd is that render_to_string isnt > working after redirect_to and render(). If I move the data-dump > before these, it works fine and no errors appear. But whatever, > although the error is just plain wrong and should not happen > (there''s no reason rener_to_string should stop working after > redirect_to or render), I''m pretty sure it wouldnt fix anything > even if it was working. > > Anyways, I gotta do something. I''ve really got two key important > factors; > #1 the user needs to not have to wait while data gets dumped, they > should get their response instantaneously > #2 the data dump must occur ASAP. Even a 1 minute delay is not > acceptable, so no Cron. > > Thanks! > Rektide "CronHater" > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > lists.rubyonrails.org/mailman/listinfo/rails-Ezra Zygmuntowicz WebMaster Yakima Herald-Republic Newspaper ezra@yakima-herald.com 509-577-7732 -------------- next part -------------- An HTML attachment was scrubbed... URL: wrath.rubyonrails.org/pipermail/rails/attachments/20060220/c30a60c8/attachment.html
You must be careful what you do inside a thread. Rails has a allow_concurrency flags for ActionController and ActiveRecord, and for best safety, this should be set to true for your application. Confusingly, it seems this is false for ActionController and true for ActiveRecord by default! For ActionController, this value seems to only be used by the caching code right now, but that could change and break an app that doesn''t set this value correctly. _____ From: rails-bounces@lists.rubyonrails.org [mailto:rails-bounces@lists.rubyonrails.org] On Behalf Of Ezra Zygmuntowicz Sent: Sunday, February 19, 2006 9:50 PM To: rails@lists.rubyonrails.org Subject: Re: [Rails] Background work Rektide- This looks like a job for ruby threads. If you do it like this the thread will run to completion in the background and your method will continue right away onto the rest of its body and render or redirect_to calls. def foo_action Thread.new { xml = render_to_string(:partial => ''datapoint'') File.open("#{RAILS_ROOT}/public/xml_files/data.xml", "w+"){ |f| f.write(xml) } } #now you can render or redirect_to and your file will #get written to disk in the backgroundconcurrently redirect_to :controller => ''foo'', :Action => ''bar'' end Cheers- -Ezra On Feb 19, 2006, at 7:39 PM, Matthew Fowle wrote: Greetings, I''ve got a rails app which is basically an admin interface to a xml dataset. Currently I''ve got rails rigged to call a function to spit the entire dataset to file with every change. This would actually be ok, its fairly infrequently updated, but when the dataset grows large the user sits there waiting for it to dump with no feedback as to whats going on. Oh yes, nearly forgot; I''m on Lighttpd with FastCGI. I was thinking maybe just maybe I could dump to file after doing the render() or redirect_to() calls and perhaps the client would get their response before the method call terminated, that perhaps the render() / redirect_to() was actually ther response being sent. I''m pretty sure the this is wrong, that the method call termiantion signals the response to client, but I got a very odd error when I tried it; ActionController::DoubleRenderError (Can only render or redirect once per action): /vendor/rails/actionpack/lib/action_controller/base.rb:591:in `render_with_no_layout'' /vendor/rails/actionpack/lib/action_controller/layout.rb:228:in `render_without_benchmark'' /vendor/rails/actionpack/lib/action_controller/benchmarking.rb:53:in `render'' /usr/lib/ruby/1.8/benchmark.rb:293:in `measure'' /vendor/rails/actionpack/lib/action_controller/benchmarking.rb:53:in `render'' /vendor/rails/actionpack/lib/action_controller/base.rb:636:in `render_to_string'' I use render_to_string(:partial => ''datapoint'') to render the individual datapoints; whats odd is that render_to_string isnt working after redirect_to and render(). If I move the data-dump before these, it works fine and no errors appear. But whatever, although the error is just plain wrong and should not happen(there''s no reason rener_to_string should stop working after redirect_to or render), I''m pretty sure it wouldnt fix anything even if it was working. Anyways, I gotta do something. I''ve really got two key important factors; #1 the user needs to not have to wait while data gets dumped, they should get their response instantaneously #2 the data dump must occur ASAP. Even a 1 minute delay is not acceptable, so no Cron. Thanks! Rektide "CronHater" _______________________________________________ Rails mailing list Rails@lists.rubyonrails.org lists.rubyonrails.org/mailman/listinfo/rails -Ezra Zygmuntowicz WebMaster Yakima Herald-Republic Newspaper ezra@yakima-herald.com 509-577-7732 -------------- next part -------------- An HTML attachment was scrubbed... URL: wrath.rubyonrails.org/pipermail/rails/attachments/20060220/cff2c7ea/attachment.html
Tom is right. There are some issues to worry about with rails and threading. Usually something like this will be fine though. But do test thouroughly. Another way to do it is with fork. But with fork you have to be careful, if you dont use the right hack, then you will get the message "Mysql has gone away" or whatever db you are using. But with this little hack it wont happen: def foo_action fork do xml = render_to_string(:partial => ''datapoint'') File.open("#{RAILS_ROOT}/public/xml_files/data.xml", "w+"){ | f| f.write(xml) } Kernal.exec "echo -n" end #now you can render or redirect_to and your file will #get written to disk in the backgroundconcurrently redirect_to :controller => ''foo'', :Action => ''bar'' end That Kernal.exec "echo -n" part is the hack that will keep your database from "goping away" as rails puts it ;-) Cheers- -Ezra On Feb 19, 2006, at 11:44 PM, Tom Fakes wrote:> You must be careful what you do inside a thread. Rails has a > allow_concurrency flags for ActionController and ActiveRecord, and > for best safety, this should be set to true for your application. > > > > Confusingly, it seems this is false for ActionController and true > for ActiveRecord by default! > > > > For ActionController, this value seems to only be used by the > caching code right now, but that could change and break an app that > doesn?t set this value correctly. > > > > From: rails-bounces@lists.rubyonrails.org [mailto:rails- > bounces@lists.rubyonrails.org] On Behalf Of Ezra Zygmuntowicz > Sent: Sunday, February 19, 2006 9:50 PM > To: rails@lists.rubyonrails.org > Subject: Re: [Rails] Background work > > > > Rektide- > > > > This looks like a job for ruby threads. If you do it > like this the thread will run to completion in the background and > your method will continue right away onto the rest of its body and > render or redirect_to calls. > > > > def foo_action > > Thread.new { > > xml = render_to_string(:partial => ''datapoint'') > > File.open("#{RAILS_ROOT}/public/xml_files/data.xml", "w+"){ |f| > f.write(xml) } > > } > > #now you can render or redirect_to and your file will > > #get written to disk in the backgroundconcurrently > > redirect_to :controller => ''foo'', :Action => ''bar'' > > end > > > > > > Cheers- > > -Ezra > > > > > > On Feb 19, 2006, at 7:39 PM, Matthew Fowle wrote: > > > > > Greetings, > > I''ve got a rails app which is basically an admin interface to a xml > dataset. Currently I''ve got rails rigged to call a function to spit > the entire dataset to file with every change. This would actually > be ok, its fairly infrequently updated, but when the dataset grows > large the user sits there waiting for it to dump with no feedback > as to whats going on. Oh yes, nearly forgot; I''m on Lighttpd with > FastCGI. > > I was thinking maybe just maybe I could dump to file after doing > the render() or redirect_to() calls and perhaps the client would > get their response before the method call terminated, that perhaps > the render() / redirect_to() was actually ther response being sent. > I''m pretty sure the this is wrong, that the method call termiantion > signals the response to client, but I got a very odd error when I > tried it; > > ActionController::DoubleRenderError (Can only render or redirect > once per action): > /vendor/rails/actionpack/lib/action_controller/base.rb:591:in > `render_with_no_layout'' > /vendor/rails/actionpack/lib/action_controller/layout.rb:228:in > `render_without_benchmark'' > /vendor/rails/actionpack/lib/action_controller/benchmarking.rb: > 53:in `render'' > /usr/lib/ruby/1.8/benchmark.rb:293:in `measure'' > /vendor/rails/actionpack/lib/action_controller/benchmarking.rb: > 53:in `render'' > /vendor/rails/actionpack/lib/action_controller/base.rb:636:in > `render_to_string'' > > I use render_to_string(:partial => ''datapoint'') to render the > individual datapoints; whats odd is that render_to_string isnt > working after redirect_to and render(). If I move the data-dump > before these, it works fine and no errors appear. But whatever, > although the error is just plain wrong and should not happen > (there''s no reason rener_to_string should stop working after > redirect_to or render), I''m pretty sure it wouldnt fix anything > even if it was working. > > Anyways, I gotta do something. I''ve really got two key important > factors; > #1 the user needs to not have to wait while data gets dumped, they > should get their response instantaneously > #2 the data dump must occur ASAP. Even a 1 minute delay is not > acceptable, so no Cron. > > Thanks! > Rektide "CronHater" > > _______________________________________________ > > Rails mailing list > > Rails@lists.rubyonrails.org > > lists.rubyonrails.org/mailman/listinfo/rails > > > > -Ezra Zygmuntowicz > > WebMaster > > Yakima Herald-Republic Newspaper > > ezra@yakima-herald.com > > 509-577-7732 > > > > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > lists.rubyonrails.org/mailman/listinfo/rails-Ezra Zygmuntowicz WebMaster Yakima Herald-Republic Newspaper ezra@yakima-herald.com 509-577-7732 -------------- next part -------------- An HTML attachment was scrubbed... URL: wrath.rubyonrails.org/pipermail/rails/attachments/20060220/3b871d5e/attachment-0001.html