Node.js は私たちの Web プロジェクトに最適ですが、Python を好む計算タスクはほとんどありません。それらの Python コードも既に用意されています。私たちは速度に非常に関心があります。node.js から Python の「ワーカー」を非同期でノンブロッキングな方法で呼び出す最もエレガントな方法は何ですか?
7 に答える
これは、zeroMQ が適しているシナリオのように思えます。これは、TCP または Unix ソケットの使用に似たメッセージング フレームワークですが、はるかに堅牢です ( http://zguide.zeromq.org/py:all ) 。
zeroMQ を使用して、かなりうまく機能する RPC フレームワークを提供するライブラリがあります。これは zeroRPC ( http://www.zeropc.io/ ) と呼ばれます。これがハローワールドです。
Python "Hello x" サーバー:
import zerorpc
class HelloRPC(object):
'''pass the method a name, it replies "Hello name!"'''
def hello(self, name):
return "Hello, {0}!".format(name)
def main():
s = zerorpc.Server(HelloRPC())
s.bind("tcp://*:4242")
s.run()
if __name__ == "__main__" : main()
そして node.js クライアント:
var zerorpc = require("zerorpc");
var client = new zerorpc.Client();
client.connect("tcp://127.0.0.1:4242");
//calls the method on the python object
client.invoke("hello", "World", function(error, reply, streaming) {
if(error){
console.log("ERROR: ", error);
}
console.log(reply);
});
またはその逆、node.js サーバー:
var zerorpc = require("zerorpc");
var server = new zerorpc.Server({
hello: function(name, reply) {
reply(null, "Hello, " + name, false);
}
});
server.bind("tcp://0.0.0.0:4242");
そしてpythonクライアント
import zerorpc, sys
c = zerorpc.Client()
c.connect("tcp://127.0.0.1:4242")
name = sys.argv[1] if len(sys.argv) > 1 else "dude"
print c.hello(name)
node.jsとPythonサーバー間の通信には、両方のプロセスが同じサーバーで実行されている場合はUnixソケットを使用し、そうでない場合はTCP/IPソケットを使用します。マーシャリングプロトコルの場合、JSONまたはプロトコルバッファを使用します。スレッド化されたPythonがボトルネックであることが判明した場合は、node.jsと同じイベント駆動型の同時実行性を提供するTwistedPythonの使用を検討してください。
冒険心があれば、clojure(clojurescript、clojure-py)を学ぶと、Java、JavaScript(node.jsを含む)、CLR、Pythonで実行され、既存のコードと相互運用するのと同じ言語が得られます。また、clojureデータ構造を使用するだけで、優れたマーシャリングプロトコルを利用できます。
Pythonワーカーを別のプロセス(長時間実行されるサーバータイプのプロセスまたはオンデマンドで生成された子のいずれか)に配置する場合、Pythonワーカーとの通信はnode.js側で非同期になります。UNIX/TCPソケットとstdin/out / err通信は、ノード内で本質的に非同期です。
Apache Thrift http://thrift.apache.org/も検討します
複数のプログラミング言語を橋渡しすることができ、非常に効率的で、非同期呼び出しまたは同期呼び出しをサポートしています。ここで完全な機能を参照してくださいhttp://thrift.apache.org/docs/features/
多言語は将来の計画に役立ちます。たとえば、後で計算タスクの一部を C++ で実行したい場合、Thrift を使用してミックスに追加するのは非常に簡単です。
私はthoonk.jsとthoonk.pyを併用して多くの成功を収めてきました。Thoonk は Redis (メモリ内のキーと値のストア) を活用して、通信用のフィード (パブリッシュ/サブスクライブと考えてください)、キュー、およびジョブ パターンを提供します。
これが unix ソケットやダイレクト tcp ソケットより優れているのはなぜですか? 全体的なパフォーマンスは少し低下する可能性がありますが、Thoonk は、ソケットを手動で処理する必要性を簡素化する非常に単純な API を提供します。また、Thoonk は、Python ワーカーの新しいインスタンスをスピンアップして同じ redis サーバーに接続するだけなので、Python ワーカーをスケーリングしてパフォーマンスを向上させることができる分散コンピューティング モデルの実装を非常に簡単にするのにも役立ちます。
たとえば、優れたGearmanを使用してワークキューを使用することをお勧めします。これにより、バックグラウンドジョブをディスパッチし、処理後に結果を非同期的に取得するための優れた方法が提供されます。
Diggで(他の多くの中で)頻繁に使用されるこの利点は、あらゆる言語のワーカーがあらゆる言語のクライアントと話すことができるようにするための強力でスケーラブルで堅牢な方法を提供することです。