r - 如何确定以system(...,wait = FALSE)开始的进程何时结束

标签 r

我正在尝试在R中设置异步system()调用。为了使此方法有用,用户需要一种方法来检查进程是否已结束。问题是如何对此进行测试?在how to run an executable file and then later kill or terminate the same process with R in Windows中,建议似乎是捕获system()调用之前和之后的所有pid,以获取刚刚启动的进程的pid(然后可以用来测试它是否已结束),但这似乎是一个容易出错的方法,最重要的是要依赖于操作系统...

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

编辑:当前方案应在以下情况中使用:

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

最佳答案

如果我们愿意调用系统来启动一个进程,那么这个问题似乎真的简化为如何将PID分配给Windows中刚刚启动的进程。这实际上不是R特定的问题,而是Windows的一般问题。通过SO的一些答案,我看到one answer that seems reasonable。处理字符串结果,并获取您的PID。

或者,您可以与system(...,wait = FALSE)异步启动另一个Rscript,并使它将自己的PID报告给主机进程(通过文件或套接字)。该Rscript可以依次进行系统调用,然后在完成系统调用时自行终止。然后,您只需注意包装Rscript的PID。这比锁定文件要好一点,因为您不必依靠调用的过程即可成功完成清理自己的锁定文件。

对于agstudy的解决方案,我会采取一些异常(exception)措施(即使它是正确的)。如ThomasP85所说,您可以通过system(...,wait = FALSE)进行异步操作。另外,您可以通过套接字获取异步操作,例如svSocketparallel(通过单个节点PSOCK群集)。这两种基于套接字的方法都没有什么与上述通过rpy2在python中发起的延迟调用的实现有根本不同。

关于r - 如何确定以system(...,wait = FALSE)开始的进程何时结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24242704/

相关文章:

r - 在 Shiny 的应用程序中动态调整ggvis图的大小

r - 用于在 ggplot2 中绘图的归一化系列

r - 如何在 knit 中使用 Sparktable 和 rmarkdown 处理 PDF

r - 我希望主要/次要网格线的 ggplot 网格线厚度不同

r - 显示data.frame中具有NA的列

r - Genbank查询(包seqinr): searching in sequence description

r - 将 n 个 ggplots 排列成下三角矩阵形状

r - 用 R 计算欧式距离

r - dendextend:color_branches 不适用于某些 hclust 方法

r - 在 R 2.15.2 上安装 Ime4 和 ggplot2 时出现问题