2016-08-01 27 views
2

Ich möchte das Klempner-Paket verwenden, um einige flexible parallele Verarbeitung auszuführen und hatte gehofft, es würde in einem node.js-Framework so arbeiten, dass es nicht blockiert ...R Klempner-Paket für node.js Parallelverarbeitung

Ich habe die folgende Klempnerdatei.

# myfile.R 

#* @get /mean 
normalMean <- function(samples=10){ 
    Sys.sleep(5) 
    data <- rnorm(samples) 
    mean(data) 
} 

Ich habe auch PM2 installiert wie hier vorgeschlagen http://plumber.trestletech.com/docs/hosting/

Ich habe auch die gleiche run-myfile.sh Datei dh

#!/bin/bash 
R -e "library(plumber); pr <- plumb('myfile.R'); pr\$run(port=4000)" 

und machte es vorgeschlagen ausführbare wie gemacht ...

I haben begonnen pm2 mit

und wollte zu sehen, testen, ob es eine nicht-blockierende node.js Rahmen durchführen könnte ...

durch eine andere R-Konsole öffnen und läuft die folgende ...

foo <- function(){ 
    con <- curl::curl('http://localhost:4000/mean?samples=10000',handle = curl::new_handle()) 
    on.exit(close(con)) 
    return(readLines(con, n = 1, ok = FALSE, warn = FALSE)) 
} 

system.time(for (i in seq(5)){ 
    print(foo()) 
}) 

Vielleicht ist es ist mein Missverständnis, wie ein node.js nicht blockierendes Framework funktionieren soll, aber in meinem Kopf sollte die letzte Schleife nur ein bisschen über 5 Sekunden dauern. Aber es scheint 25 Sekunden zu dauern, was darauf hindeutet, dass alles sequenziell und nicht parallel ist.

Wie könnte ich das Klempner-Paket verwenden, um diese nicht blockierende Eigenschaft auszuführen?

Antwort

2

pm2 kann nicht für Sie R-Prozesse laden, leider. R ist single-threaded und hat keine Bibliotheken, die es erlauben, sich asynchron zu verhalten, wie es NodeJS (noch) tut. Es gibt also nicht viele großartige Möglichkeiten, um Code wie diesen heute im Klempner zu parallelisieren. Die beste Option wäre, mehrere Klempner-R-Back-Ends auszuführen und den Datenverkehr über sie zu verteilen. Siehe den Abschnitt "Load Balancing" hier:

+1

Es gibt eine Diskussion geht hier vor, was der beste Platz sein würde, das Gespräch fortzusetzen: https://github.com/trestletech/plumber/issues/31 –

0

Grundsätzlich gleichzeitige Anfragen sind in der Warteschlange von httpuv, so dass es nicht performant ist. Der Autor empfiehlt mehrere Andock-Container, aber es kann kompliziert und response-anspruchsvoll sein.

Es gibt andere Technologie zB Rserve und rApache. Rserve-Forks laufen zusammen, und es ist möglich, rApache so zu konfigurieren, dass die Pre-Fork-Funktion für gleichzeitige Anfragen ausgeführt wird.

Siehe folgende Beiträge zum Vergleich

https://www.linkedin.com/pulse/api-development-r-part-i-jaehyeon-kim/ https://www.linkedin.com/pulse/api-development-r-part-ii-jaehyeon-kim/