У меня проблема с вызовом локальной библиотеки через Rcpp с R Studio Server. Это немного сбивает с толку, так как у меня нет проблем, когда я вызываю его из R в командной строке.
Я написал аналитическую библиотеку, которая использует функциональность Boost Threadpool для запуска нескольких потоков. Я сократил все до самого необходимого, минимального кода, который вызовет проблему — этот код просто запускает потоки в пуле потоков и затем завершает их:
#include <Rcpp.h>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/thread.hpp>
#include <boost/thread/thread.hpp>
RcppExport SEXP test_thread()
{
BEGIN_RCPP
double retdbl = 10.4;
boost::shared_ptr<boost::asio::io_service::work> threadpool_work;
boost::asio::io_service threadpool_io_service;
boost::thread_group threadpool_threads;
threadpool_work.reset( new
boost::asio::io_service::work(threadpool_io_service) );
for (int i = 0; i < 6; ++i) {
threadpool_threads.create_thread(
boost::bind(&boost::asio::io_service::run, &threadpool_io_service));
}
threadpool_io_service.stop();
threadpool_work.reset();
threadpool_threads.join_all();
return( Rcpp::wrap(retdbl) );
END_RCPP
}
Когда я запускаю из командной строки R, нет проблем. Я вернул двойника. Тем не менее, когда я запускаю через R Studio Server, он либо бесконечно зависает, либо падает, когда добирается до create_thread
заявление.
Информация о моей версии:
R version 3.1.1 (2014-07-10) -- "Sock it to Me"
0.99.489
Linux Debian-Jessie 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u6 (2015-11-09) x86_64 GNU/Linux
1.55
Это может быть просто ваша стоимость работы внутри RStudio с резьбовым кодом. Сам RStudio использует Boost для этого, а также общается с R — так что кажется, что две очереди событий перепутаны. Я думаю, если не говорить с ними, вы мало что можете сделать.
Мне очень нравится Литтлер для выполнения больших заданий в виде сценариев в командной строке. Он также является частью Debian с 2006 года и является просто apt-get
прочь для тебя.
Редактировать: Как Rcpp вы можете написать свою функцию более компактно, как
// [[Rcpp::export]]
double test_thread() {
double retdbl = 10.4;
boost::shared_ptr<boost::asio::io_service::work> threadpool_work;
boost::asio::io_service threadpool_io_service;
boost::thread_group threadpool_threads;
threadpool_work.reset( new
boost::asio::io_service::work(threadpool_io_service) );
for (int i = 0; i < 6; ++i) {
threadpool_threads.create_thread(
boost::bind(&boost::asio::io_service::run, &threadpool_io_service));
}
threadpool_io_service.stop();
threadpool_work.reset();
threadpool_threads.join_all();
return(retdbl);
}
См виньетка Атрибуты Rcpp для деталей; Вы, вероятно, хотите позвонить compileAttributes()
в каталоге пакетов; RStudio сделает это с вашим исходным пакетом.
Других решений пока нет …