gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:03:53 24 4
gpt4 key购买 nike

我正在尝试在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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com