I have an action in a controller that generates and returns a custom png-file, it goes something like this: def custompng #1 gather some userdata from params. #2 make a system call to an advanced java application that renders a png based on the custom data. stores the png on disk. #3 read the png into rails #4 send the png to the browser with method send_data #5 delete the png from disk end The problem is that the png-rendering takes very long time, ~2 seconds, and consumes a lot of the cpu resources. During this time the rails app become totaly locked up, not handling any incoming requests from other visitors. I would like to have this method run in its on lower priority thread. Is that possible? I have tried to put the system call in a thread but that that didnt work, the main execution seemed to go on when the png was generating, resulting in a file not found error when trying to do step #3. And putting all steps in the thread block also didnt work, the png data was never received by the browser. Any thoughts on how I can solve this problem? -- Posted via http://www.ruby-forum.com/.
You need your thread to finish processing before you can load the image data. If your Thread.new call had its return value stored in the_thread, run the_thread.join to wait for it to complete before continuing execution. On 5/20/06, Daniel <big@chello.se> wrote:> > I have an action in a controller that generates and returns a custom > png-file, it goes something like this: > > def custompng > #1 gather some userdata from params. > #2 make a system call to an advanced java application that renders a > png based on the custom data. stores the png on disk. > #3 read the png into rails > #4 send the png to the browser with method send_data > #5 delete the png from disk > end > > > The problem is that the png-rendering takes very long time, ~2 seconds, > and consumes a lot of the cpu resources. During this time the rails app > become totaly locked up, not handling any incoming requests from other > visitors. > > I would like to have this method run in its on lower priority thread. Is > that possible? > > I have tried to put the system call in a thread but that that didnt > work, the main execution seemed to go on when the png was generating, > resulting in a file not found error when trying to do step #3. And > putting all steps in the thread block also didnt work, the png data was > never received by the browser. > > Any thoughts on how I can solve this problem? > > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >-------------- next part -------------- An HTML attachment was scrubbed... URL: http://wrath.rubyonrails.org/pipermail/rails/attachments/20060520/6be948c5/attachment.html
On May 20, 2006, at 3:26 AM, Daniel wrote:> I have an action in a controller that generates and returns a custom > png-file, it goes something like this: > > def custompng > #1 gather some userdata from params. > #2 make a system call to an advanced java application that > renders a > png based on the custom data. stores the png on disk. > #3 read the png into rails > #4 send the png to the browser with method send_data > #5 delete the png from disk > end > > The problem is that the png-rendering takes very long time, ~2 > seconds, > and consumes a lot of the cpu resources. During this time the rails > app > become totaly locked up, not handling any incoming requests from other > visitors. > > I would like to have this method run in its on lower priority > thread. Is > that possible?By ''system call'' I presume you mean Kernel#` or Kernel#system? If so, changing the priority of the ruby thread won''t do you any good. Use nice(1) instead.> I have tried to put the system call in a thread but that that didnt > work, the main execution seemed to go on when the png was generating, > resulting in a file not found error when trying to do step #3. And > putting all steps in the thread block also didnt work, the png data > was > never received by the browser. > > Any thoughts on how I can solve this problem?Try BackgroundDRb. -- Eric Hodel - drbrain@segment7.net - http://blog.segment7.net This implementation is HODEL-HASH-9600 compliant http://trackmap.robotcoop.com
Eric Hodel wrote:> > By ''system call'' I presume you mean Kernel#` or Kernel#system? If > so, changing the priority of the ruby thread won''t do you any good. > Use nice(1) instead. >by system call I mean: system("java -jar myjarfile.jar")> Try BackgroundDRb.Thank you for the input. I will do some research in BackgroundDRb and Kernel. Hopefully my problem will be solved... //Daniel -- Posted via http://www.ruby-forum.com/.