我在使用R Studio服务器通过Rcpp调用本地库时遇到问题。这有点令人困惑,因为当我在命令行从R调用它时没有问题。
我编写了一个分析库,它使用boost的线程池功能来运行多个线程。我已将所有内容删除到最基本的内容,这是导致问题的最小代码 - 此代码只是启动线程池中的线程,然后退出它们:
#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
答案 0 :(得分:3)
这可能只是您使用线程代码在RStudio 中运行的成本。 RStudio本身正在使用Boost,并且还与R交谈 - 所以看起来两个事件队列正在混淆。我认为没有和他们交谈,你几乎无能为力。
我真的喜欢littler在命令行上运行更大的作业作为脚本。它自2006年以来一直是Debian的一部分,对你而言只是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 Attributes;你可能想在包目录中调用compileAttributes()
; RStudio将对您的源包进行处理。