R水pipe工具包,用于node.js并行处理

我想使用水pipe工包进行一些灵活的并行处理,并希望它能在一个node.js框架内工作,使其非阻塞…

我有以下水pipe工文件。

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

我也安装了pm2,如http://plumber.trestletech.com/docs/hosting/

我也做了相同的run-myfile.sh文件即

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

并提出了可执行的build议…

我已经开始使用pm2

 pm2 start /path/to/run-myfile.sh 

并想testing,看看是否可以执行一个非阻塞node.js框架…

通过打开另一个R控制台并运行以下…

 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()) }) 

也许这是我的理解 – 一个node.js非阻塞框架是如何工作的,但是在我的脑海里,最后一个循环只需要超过5秒的时间。 但似乎需要25秒,表明一切都是连续的而不是平行的。

我怎么能用水pipe工包来实现这种非阻塞性?

不幸的是,pm2不能为你加载R进程。 R是单线程的,并没有真正的库让它像NodeJS那样以asynchronous的方式工作,所以没有太多好的方法可以在水pipe工中像这样并行化代码。 最好的select是运行多个水pipe工R后端并分配stream量。 请参阅此处的“负载平衡”部分: http : //plumber.trestletech.com/docs/docker-advanced

基本上并发请求是由httpuv排队的,所以它本身不是高性能的。 作者build议多个docker集装箱,但它可能是复杂的,以及响应要求。

还有其他技术,例如Rserve和rApache。 Rserve forks prosesses,可以configurationrApache预分叉,以处理并发请求。

看到以下职位进行比较

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