在grpc服务器上跟踪多个客户端

时间:2018-07-18 15:35:22

标签: python grpc grpc-python

我正在尝试创建一个grpc python服务器,该服务器可以跟踪所有连接的客户端。

我所指的是曾荫权(Ray Tsang)所做的一次谈话/演示,他在那里收集了StreamObservers的集合,并只是遍历它们以发送给所有客户。这是其中的video供参考。

现在我的问题是如何在python中获得StreamObserver?我只在定义中看到selfrequestcontext对我可用。

这是我的第一个python项目,所以这里可能缺少一些明显的东西。

这是我的原型,基本上是样品原型

syntax = "proto3";

package hellostreamingworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // Sends another greeting
  rpc SayHelloAgain (HelloRequest) returns (stream HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

2 个答案:

答案 0 :(得分:0)

如果我了解您需要创建一个扩展grpc.UnaryUnaryClientInterceptor(https://grpc.io/grpc/python/grpc.html?highlight=unaryunaryclientinterceptor#grpc.UnaryUnaryClientInterceptor)的类ClientInterceptor 然后以这种方式将其分配给exclude_channel方法

self.channel = grpc.insecure_channel(address, options)

self.channel = grpc.intercept_channel(
     self.channel,
     ClientInterceptor()
)

您可以使用intercept_unary_unary方法接收有关各种客户端的信息。

如果要让信息服务器端扩展ServerInterceptor(https://grpc.io/grpc/python/grpc.html?highlight=serverinterceptor#grpc.ServerInterceptor)并将其分配到服务器init上

self.server = grpc.server(futures.ThreadPoolExecutor(max_workers=1000),
                          options=(('grpc.max_send_message_length', 1000 * 1024 * 1024,),
                                   ('grpc.max_receive_message_length', 1000 * 1024 * 1024,),
                                  ),
                          interceptors=(MyServerInterceptor())
                         )

然后使用intercept_service方法接收信息。

答案 1 :(得分:0)

您可能需要的是双向流服务。那就是客户端和服务器都在不断发送数据。在这种情况下,gRPC + python将跟踪您的客户端! 查看this示例代码和相应的explanation