On Wed, Oct 24, 2012 at 11:13 AM, Richard D. Morey <r.d.mo...@rug.nl> wrote: > This question involves Rook, but I think the answer will be general enough > that it pays to post here. At any rate, I don't know enough to know whether > this is a Rook only issue or a general R issue. > > Here's what I'd like to do (and indeed, have code that should do this): > > 1. Start R, Rook > 2. Start an analysis via a HTTP request to Rook. This analysis uses .Call() > to some compiled C code, if that matters. The C code calls a callback > function to update a variable with its progress. > 3. While the analysis is happening, use Rook to obtain current status with > an HTTP request > > The problem is that once the analysis starts, Rook does not respond to > requests. All of the status requests to Rook pile up, and then are answered > when the analysis (step 2) is done. Here is some example code to demonstrate > what the issue: > > ########## > > library(Rook) > s <- Rhttpd$new() > s$add( > name="pingpong", > app=Rook::URLMap$new( > '/ping' = function(env){ > req <- Rook::Request$new(env) > res <- Rook::Response$new() > res$write('This is ping.') > Sys.sleep(20) > res$finish() > }, > '/pong' = function(env){ > req <- Rook::Request$new(env) > res <- Rook::Response$new() > res$write("This is pong.") > res$finish() > }, > '/?' = function(env){ > req <- Rook::Request$new(env) > res <- Rook::Response$new() > res$redirect(req$to_url('/pong')) > res$finish() > } > ) > ) > > s$start(quiet=TRUE) > s$browse('pingpong') > > ############################# > > If you request /ping, R runs Sys.sleep() for 20 seconds. This is where my > .Call() statement would be. While the .Call() (Sys.sleep()) function is > doing its thing, I need to get Rook to respond on /pong (which would simply > respond with the progress), but if you run this code, request /ping, then > immediately request /pong, you'll see that the /pong request will not be > answered until the Sys.sleep() is done. > > Of course, for a progress report to be useful, the requests have to be > answered immediately. Is this a Rook issue, or an R issue? Or am I asking > something unreasonable?
One answer would be to start an Rserve instance on your local machine. When your web app initiates processing, it actually starts the long-running task on the server with RS.eval(wait=FALSE). See ?RCC with the RS.client package loaded. Then when you check for task completion, call RS.collect () with a short timeout, and if it has something for you it will give it to you. That doesn't give you a numeric progress report, but perhaps if your long-running task writes its status somewhere (to a file?) the progress-checking task could look there as well. Dan > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel