OpenCPU: повторное использование результатов предыдущего сеанса не работает - PullRequest
0 голосов
/ 17 июня 2019

Я хотел бы использовать 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.

1 Ответ

0 голосов
/ 19 июня 2019

Проблема здесь в том, что R является однопоточным, и, следовательно, веб-сервер httpuv (на котором основан однопользовательский сервер opencpu) может одновременно обслуживать только один запрос.В вашем примере вы создали блокировку сетки.

В вашем примере выполняется запрос к функции, которая затем отправляет второй запрос на тот же веб-сервер , используя download.file().Этот второй запрос помещается в очередь httpuv для обслуживания после завершения первого, но, очевидно, этого не происходит, потому что download.file() просто ждет, пока не истечет время ожидания.

Это не происходит на облачном сервере, потому что apache2является многопоточным.

Чтобы заставить его работать с однопользовательским сервером, вы можете заставить первую функцию сохранить данные как объект в рабочей области, а затем вторая функция сможет получить к ним доступ через ключ сеанса.Или же вы можете сохранить его на диске или в базе данных или что-то еще, где вторая функция может получить к нему доступ.Все, что не требует второго http-соединения с тем же локальным сервером.

...