12

要するに

複数のクライアント要求を非同期的に処理/ディスパッチできるR-Serverをセットアップすることは可能ですか?

ある種のソケット通信を探していると思います。または、Rが他のアプリケーションと通信できるようにするためのさらに効率的なものはありますか?

socketConnection(port=6011, server=TRUE)さて、通信が最終的に「プレーンバニラソケット通信」(サーバープロセス、JSON文字列とsocketConnection(host=Sys.info()["nodename"], port=6011)組み合わせたクライアントプロセスなど)またはそれ以上の何かを介して実現されるかどうかは、私は本当に気にしません。 HTTPリクエストに基づくWebサーバー機能を使用するような高度な」。writeLines()readLines()

詳細

まず、これらの本質的な情報学の詳細に関する私の背景はすべて「DIY」であるため、ソケット通信マスターサーバーの概念非同期通信などの詳細は私にとってかなり新しいものです。だから噛まないでください;-)

プロセスの1つをRサーバーとして機能させたいのですが。AFAIU、Rは、「マルチスレッドパラダイム」の下で設計されていません。したがって、R-Serverで同時クライアント要求(現在、JSONスタイルの文字列を介して要求/オブジェクトを送信するサードパーティソフトウェアから送信されている)を非同期で処理するにはどうすればよいのでしょうか。

平易な英語で、サーバープロセスに次のようなことを伝えたいと思います。

ポートxyで着信メッセージを受け取ったら、必要なことを実行しますが、すぐに「レスポンシブモード」に切り替えて、次のクライアントリクエストを処理できるようにし、各クライアントが論理的にリンクされた結果を取得するように常に注意します。それぞれのリクエスト。

宿題

私は非常に基本的なものから始めました:

con <- socketConnection(port=as.numeric(port), server=TRUE)

これにより、Rプロセスがサーバーになります。それは扱いconますが、私の「唯一の」接続オブジェクトであるため、サーバーは各クライアント要求を順番に処理する運命にあります。

接続からの入力を読み取り、いくつかの計算を行い、出力を接続に書き戻した後、次のクライアント要求を処理します。

「メイン」サーバープロセスが次のリクエストを受け入れる準備ができるように、サーバープロセスが実行する必要のあるすべてのものを補助Rscriptプロセスにすぐにディスパッチすることを考えました。しかし、1日の終わりに(私の「メイン」サーバープロセスで)結果を再度通過する必要があるためcon、サーバープロセスは補助プロセスが終了するまで待機する必要があるため、実際にはポイントが得られないと思います。次のリクエストを受け取る前に。または、この補助プロセスに、クライアントの要求に「直接」報告するように指示できますか?

私は現在、自分のサーバーを本格的なWebサーバーに変えることを目指していませんが、これらの洗練されたWebサーバーのアプローチは、一見すると非常に有望であるように見えました。

これらのいずれかで非同期クライアント通信は可能ですか?

どんなポインタでも大歓迎です!


編集

質問が適格になったら、300クレジットの報奨金を提供します。

4

1 に答える 1

14

Rserveはそれを正確に行うように設計されました。

多くのクライアントをサポートしており、Rもその1つです。RSclientパッケージでは、バックグラウンドで評価を実行するために実行できますRS.eval(.., wait=FALSE)RS.collect接続のリストを指定できる場所を使用して結果を収集します。

インスタンスへの並列処理のディスパッチについては、 Rserve.clusterパッケージも参照してください。Rserve

他の方法(サーバーからクライアントへ)の非同期通信も必要な場合は、RserveのOOBコマンドを参照してください(これらは、クライアントではなく、サーバーに代わって実行される非送信請求コマンドです)。必要に応じてプロキシサポートも利用できるようになりました。stats-rosuda-develメーリングリストで質問してください。

于 2012-12-11T20:35:50.117 に答える