2

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

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

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

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

4

2 回答 2

1

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

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

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

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

于 2014-08-28T10:53:55.080 回答
0

在 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/

于 2020-09-28T03:17:13.140 回答