首页 > 解决方案 > 如何在 R 中生成一个运行 R 脚本的长时间运行的并行进程?

问题描述

我有一个闪亮的应用程序,它从用户那里收集一些参数,然后将其用于运行模拟,这需要很长时间 ~ 1-3 天。因此,我希望能够告诉用户在模拟解决后进行检查,并提供提交更多输入场景的能力。所以我想在我闪亮的应用程序运行时生成一个子进程来在后台执行模拟。

我尝试了包'subprocess'和'processx',它允许生成外部进程并与它们交互。但是,我希望能够使用生成的进程运行整个 R 脚本。即运行source('simulation_script.R')。此外,我不在乎我是否无法与我的父闪亮应用程序共享任何数据。我从文件中读取输入并将输出写入文件,然后可以将其显示给闪亮的应用程序用户。实现这一目标的任何指示都会有所帮助?

标签: rparallel-processingshiny

解决方案


当您的计算过程花费的时间比用户的交互会话预期持续时间长时,您应该将整个过程分成 3 个部分:数据输入、计算、结果呈现。

现在有几个原因:

  1. 您的用户可能会在 1-3 天的时间间隔内注销他们的闪亮会话。您必须预见到一种让他们“重新连接”到他们的结果的方法。
  2. 如果您从 Shiny 会话中生成子进程,它是否完全独立于其父进程?如果您重新启动 Shiny 服务器会发生什么?它会杀死产生的子进程吗?
  3. 你如何处理多个用户?如果我、Jack 和 Bob 都在午餐前开始我们的模拟,那么您的 Shiny 进程将拉动 Shiny 服务器以及3 个模拟。Roger 吃完午饭回来并尝试提交他的模拟 - Shiny 服务器是否有足够的资源来服务 Roger 的 Shiny 会话?

因此,您将模拟分为 3 个部分:

  1. 一个闪亮的应用程序,它接受用户的订单并将其提交到队列
  2. 一个队列和一个独立于其他两个部分运行的计算部分。它的唯一责任是获取队列中的下一个订单,将其标记为正在处理,进行计算,当完成/出现错误时,将订单标记为这样并保存输出。
  3. 一个闪亮的应用程序,可以显示输出/结果。

队列和计算部分基本上是一个数据库(就像 SQLite 或 MySQL 或 MS SQL 一样简单,不管你有什么),只要它支持多个进程。计算部分是一个无限循环的脚本,请求一个任务并执行它。这允许您对其进行扩展(只需启动脚本的多个实例),将其移动到更强大的计算节点等,而不会影响 Shiny 应用程序中的演示。


推荐阅读