结合node.js和Python

Car*_*s00 125 python ipc node.js

Node.js是我们的Web项目的完美匹配,但我们更喜欢Python的计算任务很少.我们还有一个Python代码.我们高度关注速度,如何以异步非阻塞方式从node.js调用Python"worker"的最优雅方式是什么?

djh*_*eru 117

这听起来像是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()
Run Code Online (Sandbox Code Playgroud)

和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);
});
Run Code Online (Sandbox Code Playgroud)

或者反之,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");
Run Code Online (Sandbox Code Playgroud)

和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)
Run Code Online (Sandbox Code Playgroud)

  • 在有多个客户端会话的情况下,zerorpc可以处理多个状态吗? (4认同)
  • 不错的你好世界演示!下面使用 Rabbitmq 的另一个类似的解决方案。https://medium.com/@HolmesLaurence/integrating-node-and-python-6b8454bfc272 (2认同)

Ale*_*nik 84

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

如果您喜欢冒险,请学习clojure(clojurescript,clojure-py),您将获得与Java,JavaScript(包括node.js),CLR和Python上的现有代码相同的语言.通过简单地使用clojure数据结构,您可以获得出色的编组协议.

  • 你知道这样的东西是否适用于Heroku,它有一个短暂的文件系统? (2认同)

lan*_*nzz 7

如果您安排将Python工作者放在一个单独的进程中(长时间运行的服务器类型进程或按需生成的子进程),那么与它的通信在node.js端将是异步的.UNIX/TCP套接字和stdin/out/err通信在节点中本质上是异步的.


Ift*_*tah 6

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

它可以在多种编程语言之间架起桥梁,效率很高,并且支持异步或同步调用.查看完整功能http://thrift.apache.org/docs/features/

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


小智 5

我使用thoonk.jsthoonk.py取得了很大的成功.Thoonk利用Redis(内存中的键值存储)为您提供供稿(思考发布/订阅),队列和作业模式以进行通信.

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