OpenCPU:重用前一个会话的结果不起作用

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (29)

我想save_iris_as_csv用来保存.csv文件。然后,使用返回的会话调用catch_url_and_download以下载此.csv文件save_iris_as_csv。但是,catch_url_and_download不起作用,返回错误

OpenCPU error HTTP 400
cannot open URL 'http://localhost:5656/ocpu/tmp/x06c27c3ac4/files/iris.csv'

可以手动打开URL。它只是第二个R功能无法打开它。

以下是我的javascript代码。

ocpu.call("save_iris_as_csv",{},function(session){
    console.log("save_iris_as_csv is good.")
    console.log(session)
    console.log("trying to call catch_url_and_download.")
    ocpu.call("catch_url_and_download",{
        url:session.loc + "files/iris.csv"
    },function(session2){
        console.log(session2)
    }).fail(function(e){
        console.log("catch_url_and_download failed. Cannot open URL xxx.")
        alert(e.responseText)
    })
})

以下是我的R代码。

save_iris_as_csv = function(){
  write.csv(iris,"iris.csv")
}
catch_url_and_download = function(url){
  download.file(url,"iris.csv")
}

我正在使用Windows操作系统。

提问于
用户回答回答于

这里的问题是R是单线程的,因此httpuv webserver(opencpu单用户服务器所基于的)一次只能提供一个请求。在您的示例中,您创建了一个网格锁。

您的示例使得以一个函数,然后进行第二次请求的请求相同的网络服务器使用download.file()。当第一个请求完成时,第二个请求被httpuv排队,但显然从未发生,因为download.file()只是一直等待,直到它超时。

这在云服务器中不会​​发生,因为apache2是多线程的。

要使其与单用户服务器一起使用,您可以使第一个函数将数据保存为工作空间中的对象,然后第二个函数可以通过会话密钥访问它。或者,您可以将其保存在磁盘或数据库或其他内容中,第二个函数可以访问它。任何不需要第二个http连接到同一本地服务器的东西。

扫码关注云+社区

领取腾讯云代金券