LINUX.ORG.RU

Сообщения fffafasnow

 

Потокобезопастность в GRPC

Привет, всем! Помогите поставить блокировки. Имеется некоторый класс SomeClass, с некоторым методом someHardWorkCalculation(), выполняющем длительные линейные расчеты. Судя по документации строка с присвоением данных f и реальная отправка данных происходят асинхронно (в разных потоках). Как заставить работать вот эту конструкцию потокобезопастно?

Status ListFeatures(ServerContext* context, const Rectangle* rectangle,
                    ServerWriter<GetSomeResponse>* writer) override {
  GetSomeResponse reply;
  while(SomeCondition) {
    // ...
    std::string document = objectSomeClass.someHardWorkCalculation();
    reply.set_document(document);
    // ...
    writer->Write(reply);
  }
  return Status::OK;
}

Вот такая схема нормально выглядит?

mutex m_reply_1;
Status ListFeatures(ServerContext* context, const Rectangle* rectangle,
                    ServerWriter<GetSomeResponse>* writer) override {
  GetSomeResponse reply;
  while(SomeCondition) {
    // ...
    {
        unique_lock lck {m_reply_1};
        std::string document = objectSomeClass.someHardWorkCalculation();
        reply.set_document(document);
    }
    // ...
    {
        shared lock lck {m_reply_1};
        writer->Write(reply);
    }
  }
  return Status::OK;
}
Хотя, не нормально скорее всего. Ведь Write() уйдет в поток, но реально может еще не выполниться <-- здесь не понятно что внутри Write из grpc.

P.S. [https://www.grpc.io/docs/languages/cpp/basics/]

В документации рассматривается пример, в котором отсылается данные из feature_list_, который в свою очередь должен быть потокобезопастным, так как методы GRPC работают в разных потоках. Отсюда я делаю вывод, что Write() может работать в потоке, отличном от ListFeature.

Status ListFeatures(ServerContext* context, const Rectangle* rectangle,
                    ServerWriter<Feature>* writer) override {
  for (const Feature& f : feature_list_) {
      // ...
      writer->Write(f);
    }
  }
  return Status::OK;
}

 ,

fffafasnow
()

тестовые байты в сокет

сем, привет!

Для тестирования даны тестовые байты просто в текстовом файле в виде шестнадцатиричных цифр:

00  61  00  3b  00  62 ...

Как правильно передать из в сокет, т.е. сконвертить в char*?

 ,

fffafasnow
()

int to bytes (char*)

Почему буфер L пуст?

size_t bL = 55; 
char L[4];
L[0] = (bL >> 24) & 0xFF;
L[1] = (bL >> 16) & 0xFF;
L[2] = (bL >> 8) & 0xFF;
L[3] = bL & 0xFF;
printf("%x %x %x %x", L[0], L[1], L[2], L[3]); // 0 0 0 37
printf(" strlen(L) = %i\n", strlen(L)); // strlen(L) = 0
Помогите получить char *L с реально заполенными 4-мя символами (байты числа 55).

 

fffafasnow
()

proxy with gRPC

А можно ли как-то в gRPC воспользоваться отдельно сокетам и протобуфером, дополнительно к серверному grpc функционалу. Мне нужно сделать RPC прокси к некоторому серваку, который не RPC, но сообщения передает и принимает в виде protobuf???

Т.е. есть gRPC сервер, и прямо внутри методов я вызваю сокет, который связывается с настоящим сервером.

Ну вот как то так:

class GreeterServiceImpl final : public QObject, public Greeter::Service {
Q_OBJECT
public:
  Status SayHello(ServerContext* context, const HelloRequest* request,  HelloReply* reply);
  SomeGrpcSslSock sock;
};

Status GreeterServiceImpl::SayHello(ServerContext* context, const HelloRequest* request,  HelloReply* reply)
{

    std::string prefix("Hello ");
    reply->set_message(prefix + request->name());

    sock.connectToHost("www", 12345);
    // ...

    return Status::OK;
}

 ,

fffafasnow
()

Qt & gRPC

Как Qt и gRPC заставить работать вместе? В чем идея постоения архитектуры? Опыты провожу на helloworld отсюда https://github.com/plasticbox/grpc-windows/tree/master/grpc_helloworld/src

Попытка первая, просто попробовать добавить синнал

class GreeterServiceImpl final : public Greeter::Service, public QObject {
Q_OBJECT
 public:
  Status SayHello(ServerContext* context, const HelloRequest* request,  HelloReply* reply) override {
    std::string prefix("Hello ");
    reply->set_message(prefix + request->name());
    emit message();
    return Status::OK;
  }
signals:
   void message();
};
не позволяет собрать приложение
In function `GreeterServiceImpl::GreeterServiceImpl()':
error: undefined reference to `vtable for GreeterServiceImpl'
In function `GreeterServiceImpl::~GreeterServiceImpl()':
error: undefined reference to `vtable for GreeterServiceImpl'
error: collect2: error: ld returned 1 exit status

Добавляем конструктор

explicit GreeterServiceImp(QObject *parent=nullptr) : QObject(parent) {}
ошибки те же.

Потытка вторая, связана с программированием на Qt внутри gRPC методов, и тоже не приводит к успеху

  Status SayHello(ServerContext* context, const HelloRequest* request,  HelloReply* reply) override {
    QSslSocket mSocket;
    QSslConfiguration config = mSocket.sslConfiguration();
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    config.setProtocol(QSsl::SecureProtocols);
    mSocket.setSslConfiguration(config);
    mSocket.connectToHostEncrypted("google.com", 8080);
    std::string prefix("Hello ");
    reply->set_message(prefix + request->name());
    emit message();
    return Status::OK;
  }
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QSslSocket(0x5598fd195520), parent's thread is QThread(0x5598fd18e800), current thread is QThread(0x7f3a30004510)

 ,

fffafasnow
()

RSS подписка на новые темы