1

我们正在尝试使用 ZeroRPC 从 NodeJS 调用 python 模块。

节点代码:

app.get('/topList', function(req, res){
    var zerorpc = require("zerorpc");
    var client = new zerorpc.Client({ timeout: 3000, heartbeatInterval: 300000 });
    console.log('Here');
    client.connect("tcp://127.0.0.1:4212");
    console.log('And Here');
    client.invoke("toplist", '2015-02-13T05:46:29.800Z', '2015-02-13T08:46:29.800Z', function(error, tlist, more) 
    {
        console.log('And Here also');
        if(error) {
            console.error(error);
        } 
        console.log(tlist);
        res.send(tlist);
        client.close();
    });
});

Python代码:

import zerorpc
import logging
import gevent
logging.basicConfig()

class HelloRPC(object):
   def toplist(self, fromtime, tilltime): 
       print 'Python Hello'
       # Doing some some manipulations and placing the result in the variable top_20
       return top_20

 p = HelloRPC()  
 s = zerorpc.Server(p)
 s.bind("tcp://127.0.0.1:4212")
 s.run()

首先,我们运行 python 代码来启动服务器。接下来我们启动 nodejs 代码。

现在第一次在浏览器中尝试 localhost:8080/topList,nodejs 向 python 发出请求,然后 python 程序运行并将结果返回给 nodejs,然后在浏览器中我们可以看到结果。

如果我们第二次尝试 localhost:8080/topList 就会出现问题,nodejs 无法调用 python 代码。我们在 python 控制台中没有看到“Python Hello”。

我们无法修复这种情况。它只是第一次运行,然后 nodejs 无法调用 python。第一次运行后服务器是否关闭。

我们还尝试使用 While True 或 gevent ,如下所示。但仍然是同样的问题。

While True:
    p = HelloRPC()  
    s = zerorpc.Server(p)
    s.bind("tcp://127.0.0.1:4212")
    s.run()
    #gevent.spawn(s.run)

谁能提供一些想法来解决这个问题?

4

0 回答 0