据我所知,OpenCPU中没有任务模型, 即,必须等待任意长时间使用开放的TCP连接,直到请求结束。
任务模型实现的一种可能性是,当希望运行函数时,立即为200 OK
请求返回状态为POST
的专用任务uri。优点是客户端会在后台服务器上运行作业时立即获得结果。
然后,客户端将轮询任务URI,直到它返回201 created
,表示作业已成功完成,或者是不成功调用的错误代码。在成功案例中,正文将包含由POST
现在直接创建的相同资源列表。
对此模型或类似方法有何看法?每个人如何处理这个?我认为在没有开放TCP连接的情况下支持长时间运行的作业是有价值的我想到了可选功能,例如在轮询正在运行的作业时提供进度信息等。
答案 0 :(得分:1)
您确定当前版本的OpenCPU不包含任务管理器。客户端必须在等待请求完成时保持连接活动。这使得API在大多数用例中保持简洁和简单,但它不适合于安排长时间运行的作业。但是,所有时间限制都是可配置的,因此没有什么可以阻止您等待30分钟完成工作。
正如您所建议的,另一种设计是返回Accepted 202
以获取有效的POST请求,然后让客户端轮询结果的状态。这将是API的一个很好的补充(可能会在一天内添加),但它在客户端和服务器实现中引入了相当复杂的一些。
在服务器上,您需要编写一个任务管理器,并且可能担心要监视,超时和手动终止长时间运行的请求的功能。而且,在函数仍在执行时,R可以提供的信息不多。例如,实际上无法知道函数调用距离完成的距离。
可能的一件事是捕获中间标准输出,以便您可以通过定期打印某些状态在R函数中实现自己的进度指示器。然后,客户端可以重复检索一些URL以读取标准输出并询问请求的状态。但是我怀疑这会有多大用处。我很少看到R函数中的进度表(除非debug=TRUE
或其他东西),所以我不确定这对于远程调用的R函数会有什么不同。
答案 1 :(得分: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/