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-金/