Я заинтересован в написании программы на С ++, способной запускать R-скрипты. По нескольким причинам я хотел бы создать экземпляр RInside, выполнить скрипт, получить результат и уничтожить экземпляр; все в потоке. Я знаю, что R не является многопоточным, и что нельзя создавать несколько экземпляров RInside. Но можно ли создавать отдельные экземпляры в изолированных потоках? Когда я пытаюсь сделать это, мой код компилируется, но я получаю следующую ошибку во время выполнения:
Error: C stack usage is too close to the limit
Error: C stack usage is too close to the limit
terminate called after throwing an instance of 'Rcpp::binding_not_found'
what(): binding not found: '.AutoloadEnv'
Aborted
Вот код, который выдал ошибку:
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <RInside.h>
void *thread_main(void *args){
RInside R(0,NULL);
/* hope to execute an R script here */
printf("--printing from thread--\n");
return NULL;
}
int main(int argc, char *argv[]){
pthread_t tid;
if( pthread_create(&tid, NULL, thread_main, NULL) ){
printf("failed to create thread\n");
return -1;
}
sleep(1);
return 0;
}
Я пробовал настройку R_CStackLimit = (uintptr_t)-1
как рекомендуется в Writing R Extension, но безрезультатно.
Я использую Ubuntu, R версии 2.15.2, RInside версии 0.2.10.
Возможно ли это сделать? или я должен учить что-то вроде Rserve?
Спасибо вам большое!
R является и, вероятно, останется однопоточным. RInside идет на некоторую длину, чтобы убедиться, что он создан как синглтон; если вы опровергаете это, вы получаете ошибки, которые вы видите выше. Внутри того же исполняемого файла вы получите только один экземпляр RInside, поэтому один на поток не будет работать. Как вы испытали.
Посмотрите примеры, которые я включаю в источник, о том, как справиться с однопоточным бэкэндом при использовании многопоточных внешних интерфейсов, таких как Qt или библиотека Wt для веб-приложений.
В долгосрочной перспективе мы сможем сделать то, что делает Rserve, и раскошелиться. Вклад в код будет приветствоваться, у меня, вероятно, не будет времени работать над этим.
Других решений пока нет …