gpt4 book ai didi

c++ - thrift 异步 C++ 示例

转载 作者:行者123 更新时间:2023-11-30 03:31:26 24 4
gpt4 key购买 nike

我查看了 Apache Thrift 发行版,并在 apache.org 网站上寻找示例,但没有成功。

我希望有人向我指出异步客户端的示例实现和经典 Apache Thrift 中的非阻塞服务器(不是来自Facebook),它使用“--gen cpp”。

我可以看到标题为“apache thrift C++ async client”的类似问题,但答案并未包含所有内容。

我想看看“.thrift”文件,然后是填写好的服务器,以及相应的客户端代码。

我真的很想相信有人做到了这一点,我只是没有我想象的那么好谷歌用户。

我知道 Facebook 版本 (fbthrift) 旨在帮助更好地做到这一点,但我一直对那个版本看起来多么不稳定感到沮丧。如果有人能给我指出一个稳定版本的 fbthrift,它不是每天都在修改,我可以考虑将其作为替代方案。

最佳答案

不确定异步客户端是什么意思,但我会根据我的理解尽力回答这个问题。

如果通过“异步客户端”,您的意思是像 node.js 中那样谈论异步,其中执行遵循回调结构,AFAIK 不是开源 Thrift 的一部分。然而,它在 fbthrift 中可用。 . Facebook 有很多工具可以与 fbthrift 结合使用包括他们流行的开源 C++ 库 folly .通过 thrift C++ 客户端接口(interface)调用其他 thrift 服务必须阻塞。

这是我在尝试异步非阻塞服务器时用来开始的代码。希望对您有所帮助!

something.thrift

#!/usr/local/bin/thrift --gen cpp

namespace cpp something

service Something {
i32 ping()
}

SomethingServer.cpp

#include "gen-cpp/Something.h"
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/server/TSimpleServer.h>
#include <thrift/server/TThreadedServer.h>
#include <thrift/server/TNonblockingServer.h>
#include <thrift/transport/TServerSocket.h>
#include <thrift/transport/TBufferTransports.h>
#include <thrift/concurrency/ThreadManager.h>

#include <iostream>

using std::cout;
using std::endl;

class SomethingHandler : virtual public something::SomethingIf {
public:
SomethingHandler() {
cout << "Initialized" << endl;
}

int32_t ping() override {
// Your implementation goes here
cout << "Ping!" << endl;
return 1;
}
};

int main(int argc, char **argv) {
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
using namespace ::apache::thrift::concurrency;
using boost::shared_ptr;
using namespace ::something;

int port = 9090;
shared_ptr<SomethingHandler> handler(new SomethingHandler());
shared_ptr<TProcessor> processor(new SomethingProcessor(handler));
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());

// using thread pool with maximum 15 threads to handle incoming requests
shared_ptr<ThreadManager> threadManager
= ThreadManager::newSimpleThreadManager(15);
shared_ptr<PosixThreadFactory> threadFactory
= shared_ptr<PosixThreadFactory>(new PosixThreadFactory());
threadManager->threadFactory(threadFactory);
threadManager->start();

TNonblockingServer server(processor, protocolFactory, port, threadManager);
server.serve();

return 0;
}

SomethingClient.cpp

#include "Something.h"

#include <thrift/transport/TSocket.h>
#include <thrift/transport/TBufferTransports.h>
#include <thrift/protocol/TBinaryProtocol.h>

using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;

using namespace Test;

int main(int /* argc */, char** /* argv */) {
boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090));
boost::shared_ptr<TTransport> transport(new TFramedTransport(socket));
boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));

SomethingClient client(protocol);
transport->open();
for (auto i = 0; i < 10000; ++i) {
client.ping();
}
transport->close();

return 0;
}

关于c++ - thrift 异步 C++ 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44223453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com