RStudio зависает при вызове boost :: threadpool через Rcpp

У меня проблема с вызовом локальной библиотеки через 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"
  • R Studio: 0.99.489
  • Linux: 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

1

Решение

Это может быть просто ваша стоимость работы внутри 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 сделает это с вашим исходным пакетом.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]