Antoine Pitrou created ARROW-11841:
--------------------------------------

             Summary: [R][C++] Allow cancelling long-running commands
                 Key: ARROW-11841
                 URL: https://issues.apache.org/jira/browse/ARROW-11841
             Project: Apache Arrow
          Issue Type: Improvement
          Components: C++, R
            Reporter: Antoine Pitrou


When calling a long-running task (for example reading a CSV file) from the R 
prompt, users may want to interrupt with Ctrl-C.

Allowing this will require integrating R's user interruption facility with the 
cancellation API that's going to be exposed in C++ (see  ARROW-8732).

Below some information I've gathered on the topic:

There is some hairy discussion of how to interrupt C++ code from R at 
https://stackoverflow.com/questions/40563522/r-how-to-write-interruptible-c-function-and-recover-partial-results
 and https://stat.ethz.ch/pipermail/r-devel/2011-April/060714.html .

It seems it may involve polling cpp11::check_user_interrupt() and catching any 
cpp11::unwind_exception that may signal an interruption. A complication is that 
apparently R APIs should only be called from the main thread. There's also a 
small library which claims to make writing all this easier: 
https://github.com/tnagler/RcppThread/blob/master/inst/include/RcppThread/RMonitor.hpp

But since user interruptions will only be noticed by the R main thread, the 
solution may be to launch heavy computations (e.g. CSV reading) in a separate 
thread and have the main R thread periodically poll for interrupts while 
waiting for the separate thread. This is what this dedicated thread class does 
in its join method: 
https://github.com/tnagler/RcppThread/blob/master/inst/include/RcppThread/Thread.hpp#L79




--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to