结合node.js和Python

Node.js与我们的web项目完美匹配,但是我们更喜欢Python的计算任务很less。 我们也已经有了一个Python代码。 我们非常关心速度,如何以asynchronous非阻塞的方式从node.js调用Python“worker”,最优雅的方式是什么?

对于node.js和Python服务器之间的通信,如果两个进程在同一台服务器上运行,那么我将使用Unix套接字,否则使用TCP / IP套接字。 对于编组协议,我会采取JSON或协议缓冲区 。 如果线程化Python显示出瓶颈,请考虑使用Twisted Python ,它提供与node.js相同的事件驱动并发性。

如果你觉得冒险,学习clojure ( clojurescript , clojure-py ),你将得到相同的语言,运行与Java,JavaScript(包括node.js),CLR和Python的现有代码互操作。 你只需使用clojure数据结构即可获得超级的编组协议。

这听起来像zeroMQ将是一个很好的情况。 这是一个类似于使用TCP或Unix套接字的消息传递框架,但它更健壮( http://zguide.zeromq.org/py:all

有一个库使用zeroMQ来提供一个RPC框架,工作得很好。 这就是所谓的zeroRPC( http://www.zerorpc.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) 

如果你安排你的Python工作者在一个单独的进程中(长时间运行的服务器types的进程或按需产生的subprocess),你的通信将在node.js端是asynchronous的。 UNIX / TCP套接字和stdin / out / err通信在节点中本质上是asynchronous的。

我也会考虑Apache Thrift http://thrift.apache.org/

它可以在多种编程语言之间进行桥接,高效并支持asynchronous或同步呼叫。 在这里看到完整的functionhttp://thrift.apache.org/docs/features/

多语言对未来的计划可能是有用的,例如,如果您稍后想要在C ++中执行部分计算任务,则使用Thrift将其添加到混合中是非常容易的。

使用thoonk.js和thoonk.py,我已经取得了很多成功。 Thoonk利用Redis(内存中键值存储)为您提供feed(认为发布/订阅),队列和作业模式进行通信。

为什么这比unix套接字或直接tcp套接字好? 整体性能可能会有所下降,但Thoonk提供了一个非常简单的API,简化了手动处理套接字。 Thoonk还帮助实现了一个分布式计算模型,使您可以扩展python worker以提高性能,因为您只需启动python worker的新实例并将其连接到同一个redis服务器即可。

我build议使用一些工作队列,例如,使用优秀的Gearman ,这将为您提供一个很好的方式来分派后台作业,并在处理后asynchronous获取结果。

Digg的这个优势在很多方面都被大量使用,它提供了一个强大的,可扩展的,可靠的方法,使得任何语言的工作人员都可以用任何语言与客户进行交stream。