并发远程过程调用C ++对象

时间:2013-07-17 21:53:41

标签: c++ python map concurrency rpc

我希望有一个用C ++编写的类作为远程过程调用服务器。

我有一个大的(超过一千兆字节)文件,我解析,读取参数来实例化我然后存储在std :: map中的对象。我希望RPC服务器监听来自客户端的调用,获取从客户端传递的参数,在地图中查找适当的值,进行计算,并将计算出的值返回给客户端,我希望它能够服务并发请求 - 所以我想让多个线程监听。顺便说一下,填充地图后,它不会改变。请求只会从中读取。

我想用Python编写客户端。服务器可能只是一个侦听POST请求的HTTP服务器,而客户端可以使用urllib来发送它们吗?

我是C ++的新手,所以我不知道如何编写服务器。有人能指点我一些例子吗?

2 个答案:

答案 0 :(得分:0)

也许因素会影响选择。

一种解决方案是使用fastcgi。

客户端向启用了fastCGI的HTTP服务器发送HTTP请求。 HTP服务器通过fastcgi机制将请求分派给您的RPC服务器。 RPC服务器进程并生成响应,并发送回http服务器。 http服务器将响应发送回您的客户端。

答案 1 :(得分:0)

如果你必须用C ++编写服务器,而你不知道怎么做,你肯定想要使用框架。

有很多选择,StackOverflow不是一个讨论不同选择意见的好地方。但举一个例子,JsonRpc-Cpp允许您在大约10行代码中实现JSON-RPC(通过原始TCP或HTTP)服务器,并为您要公开的每个RPC添加一行样板。比从头编写服务器容易得多。

所以,这是一个示例服务器:

#include <cstdlib>
#include <jsonrpc.h>

class Service {
public:
    bool echo(const Json::Value &root, Json::Value &response) {
        response["jsonrpc"] = "2.0";
        response["id"] = root["id"];
        Json::Value result;
        result["params"] = root["params"];
        response["result"] = result;
        return response;
    }
}

int main(int argc, char *argv[]) {
    int port = std::atoi(argv[1]); // add some error handling here...

    Json::Rpc::TcpServer server("127.0.0.1", port);
    Service service;
    server.AddMethod(new Json::Rpc::RpcMethod<Service>(service,
                     &Service::echo, "echo");
    server.Bind(); // add error handling again
    server.Listen();
    while(true) server.WaitMessage(1000);
}

但是,如果您使用Python编写服务器,或者使用WSGI Web服务器并使用Python编写服务,并使用Python调用C ++代码(无论是通过ctypes还是通过使用Cython或SIP等方法构建包装器。

这是使用bjsonrpc的Python中相同的服务器:

import bjsonrpc

class Service(bjsonrpc.handlers.BaseHandler):
    def echo(self, *args):
        return {'params': args}

server = bjsonrpc.createserver(handler_factory = Service)
server.serve()