【问题标题】:Task model for long-running jobs in OpenCPU?OpenCPU中长时间运行的作业的任务模型?
【发布时间】:2014-08-28 08:47:27
【问题描述】:

据我所知,OpenCPU 中没有任务模型, 即,一个开放的 TCP 连接必须等待任意长的时间,直到请求完成。

任务模型实现的一种可能性是在希望运行函数时立即为POST 请求返回一个状态为200 OK 的专用任务uri。这样做的好处是,当作业在后台运行在服务器上时,客户端会立即得到结果。

然后客户端将轮询任务 URI,直到它返回 201 created,这意味着作业已成功完成,或者调用不成功的错误代码。在成功的情况下,正文将包含由 POST 现在直接创建的相同资源列表。

对此模型或类似方法有何看法?大家是怎么处理这个问题的?我认为在没有打开 TCP 连接的情况下支持长时间运行的作业会很有价值。我还想到了一些可选功能,例如在轮询仍在运行的作业时提供进度信息等。

【问题讨论】:

    标签: opencpu


    【解决方案1】:

    当前版本的 OpenCPU 不包含任务管理器是正确的。客户端必须在等待请求完成时保持连接处于活动状态。这使 API 对于大多数用例保持良好和简单,但对于调度长时间运行的作业来说并不是最佳选择。但是,所有时间限制都是可配置的,因此没有什么可以阻止您等待 30 分钟完成工作。

    正如您所建议的,另一种设计是为有效的 POST 请求返回 Accepted 202,然后让客户端轮询结果的状态。这将是对 API 的一个很酷的补充(也许有一天会添加),但它在客户端和服务器实现中引入了相当多的复杂性。

    在服务器上,您需要编写一个任务管理器,并且可能会担心监控、超时和手动终止长时间运行的请求的功能。此外,当函数仍在执行时,R 无法为您提供太多信息。例如,真的没有办法知道函数调用距离完成还有多远。

    可能的一件事是捕获中间标准输出,这样您就可以通过定期打印某些状态在 R 函数中实现自己的进度指示器。然后,客户端可以重复检索一些 URL 以读取标准输出并查询请求的状态。但是我怀疑这会有多大用处。我很少在 R 函数中看到进度表(除非debug=TRUE 或其他东西),所以我不确定这对于远程调用的 R 函数会有什么不同。

    【讨论】:

    • 是的,只要连接仍然存在,它目前运行良好。我同意进度指标目前没有被广泛使用 - 但这至少会在我的包中迅速改变。
    • 如果您有明确定义的用例,请随时在 github 上提出建议。
    • 一个非常简单的用例是我通过 WiFi 和公司 VPN 使用 OpenCPU,众所周知,它在 TCP 上不稳定。 ;-) 但我知道你的意思......我会考虑一下。
    【解决方案2】:

    在 OpenCPU 上管理长时间运行的任务现在可以轻松处理。

    #Ref - https://www.opencpu.org/jslib.html

    您可以将流程分为两个步骤

    第 1 步 - 调用函数并使用会话对象立即回调。

    第 2 步 - 稍后使用会话对象检索数据

    使用 Javascript -

    var mysession;
    
    var req = ocpu.call("rnorm", {n: 100}, function(session){
        mysession = session;
    })
    
    setTimeout(function(){
    
        mysession.getObject(function(data){
            //data is the object returned by the R function
            alert("Array of length " + data.length + ".\nFirst few values:" + data.slice(0,3));
        });
        
    },60000);
    

    在上面的代码中,我们在 OCPU 中调用了一个 R 函数,但只获取了会话对象,然后使用会话对象获取数据。第二个函数可以在以后随时调用。

    更详细的 JSFIDDLE 示例 - http://jsfiddle.net/opencpu/ecwbd/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 2014-09-10
      • 1970-01-01
      • 2012-08-13
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多