2016-08-01 15 views
2

配管パッケージを使用して柔軟な並列処理を行いたいと思います。ノンブロッキングであるようにnode.jsフレームワーク内で動作することを期待していました...node.js並列処理用R配管パッケージ

私は次の配管用ファイルを持っています。私も

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

すなわち、同じrun-myfile.shファイルを作り、それが実行可能な提案として行ったhttp://plumber.trestletech.com/docs/hosting/

ここで提案されているよう

# myfile.R 

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

私も...

IをPM2をインストールしていますpm2を使用して起動しました

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

と、それは別のRコンソールを開き、以下のコマンドを実行して、非ブロックnode.jsフレームワーク...

を実行できるかどうかをテストしたかった...

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秒かかると思われ、すべてが並行ではなく連続的であることを示唆している。

ノンブロッキングの性質を実行するために配管工パッケージを使用するにはどうすればよいですか?

答えて

2

pm2は残念なことにRプロセスの負荷分散ができません。 Rはシングルスレッドであり、NodeJSのように非同期的な振る舞いをするライブラリを持っていないので、今日のように配管工でこのようなコードを並列化する方法はあまりありません。最良の選択肢は、複数の配管工Rのバックエンドを実行し、それらの間にトラフィックを分散させることです。 http://plumber.trestletech.com/docs/docker-advanced

+1

については、以下の記事を参照してください。https://github.com/trestletech/plumber/issues/31 –

0

基本的に同時に実行される要求は、httpuvによってキューに入れられ、パフォーマンスはそれ自身では成立しません。著者は複数のドッカーコンテナを推奨していますが、複雑であり、応答が要求されることもあります。

他の技術、たとえばRserveとrApacheがあります。 Rserveはプロセスをフォークし、同時リクエストを処理するためにrApacheをプリフォークするように設定することができます。

会話を継続するのに最適な場所となり、ここで起こって議論が、あります比較

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