如何确定以 system(..., wait=FALSE) 启动的进程何时结束

Tho*_*P85 6 r

我正在尝试在 R 中设置一个异步 system() 调用。为了使它有用,用户需要一种方法来检查进程是否已经结束。问题是如何测试?在如何运行可执行文件,然后在 Windows 中使用 R 杀死或终止相同的进程时,建议似乎是在 system() 调用之前和之后捕获所有 pid 以获取刚刚启动的进程的 pid (然后可以用来测试它是否已经结束),但这似乎是一种容易出错的方法,而且它依赖于操作系统......

是否有其他方法可以解决此问题(不必涉及 pid)

编辑:这应该用于当前场景:

我正在开发一个 Shiny GUI,它可以处理在 Java 中实现的可能很长时间运行的计算。计算是分批完成的,在这些运行期间,即使 R 空闲,GUI 也被锁定,无法与 R 服务器交互,因为它正在等待 Java 进程完成。我想要一种方法来启动 Java 进程而不是等待它完成(使用 wait=FALSE 参数),而是有一种检查它是否已完成的故障安全方法,因此可以相应地更新 GUI...

ags*_*udy -3

R甚至不支持多线程系统。所以异步调用它不会很容易。一种方法是通过支持异步调用的语言来调用它。例如蟒蛇:

  • 用于twisted异步操作。
  • 用于rpy2在 python 函数中调用 R 调用

这是一个完整的示例,异步调用 2 个 R 函数:

  1. 给定一个半径,它会在随机睡眠一段时间后计算周长
  2. 给定已计算的周长,它返回原始半径

这是一个虚拟示例,但它足够灵活,可以扩展到任何 R 脚本。

from twisted.internet.defer import Deferred
from twisted.internet import reactor
import rpy2.robjects as robjects

 ## define the functions 
 def get_perimeter(r):
     robjects.r('''
        f <- function(r) {
            Sys.sleep(sample(1:3,1))
            2 * pi * r

        }
        ''')
    r_f = robjects.r['f']
    print  r_f(r)
    return r_f(r)

def get_radius(p):
    robjects.r('''
        f <- function(p)    p/2 / pi
        ''')
    r_f = robjects.r['f']
    print  r_f(p)
    return r_f(p)


def job_done(_):
    from twisted.internet import reactor
    reactor.stop()

## the asynchronous call 
d = Deferred()
d.addCallback(get_perimeter)
d.addCallback(get_radius)
d.addCallback(job_done)


reactor.callWhenRunning(d.callback, 25410)

reactor.run()
Run Code Online (Sandbox Code Playgroud)

  • R 函数不需要异步运行。它是一个系统命令(“wait”参数已支持该命令)。我正在寻找一种方法来检查以 system() 调用启动的进程是否已完成...抱歉,如果最初的问题不透明... (4认同)