2014-08-28 64 views
1

据我所知,在OpenCPU中没有任务模型, ,即一个人必须等待任意长的TCP连接,直到请求结束。OpenCPU中长时间运行作业的任务模型?

任务模型实现的一种可能性是当需要运行某个函数时,立即返回一个专用任务uri,其状态为200 OK,用于POST请求。优点是客户端会在后台运行服务器时立即得到结果。

然后,客户端将轮询任务URI,直到它返回201 created,表示作业已成功完成,或调用失败的错误代码。在成功案例中,主体将包含现在由POST直接创建的相同资源列表。

对此模型或类似方法有什么意见?每个人如何处理这个问题?我认为在没有开放TCP连接的情况下支持长时间运行的作业将是有价值在我看来,可选功能比如在轮询仍在运行的工作时提供进度信息等。

回答

1

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

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

在服务器上,您需要编写任务管理器,并且可能担心要监视,超时和手动终止长时间运行的请求的功能。而且,功能还在执行时,R可以给你的信息并不多。例如,真的没有办法知道函数调用的结束程度。

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

+0

是的,只要连接仍然存在,它目前运行良好。我同意目前尚未广泛使用的进度指标 - 但这至少会在我的套餐中迅速改变。 – 2014-08-28 11:17:13

+0

如果您有明确定义的用例,请随时在提议中的github上打开问题。 – Jeroen 2014-08-28 13:24:33

+0

一个非常简单的用例是我使用OpenCPU通过WiFi和公司VPN,这在TCP上非常不稳定。 ;-)但我知道你的意思......我会给它一个想法。 – 2014-08-29 17:04:06