异步链接grpc调用

时间:2019-03-18 18:27:09

标签: python grpc

有没有一种直接的方法可以在Python中异步链接GRPC调用?

这感觉像是“应该”可行的事情,但我似乎找不到。

以下是我应该做的事的大致构想:

class MyServer(my_grpc.MyServicer):
  def __init__(self, child_stub):
    self.child_stub_ = child_stub

  def MyMethod(self, request, context):
    child_result = self.child_stub_.ChildMethod.future(my_grpc.ChildMethodParams())

    child_result.add_done_callback(something_that_completes_MyMethod)

    return presumably_something

我这里缺少什么吗?感觉这将是一个常见的用例,但我似乎在文档中找不到与之相关的任何内容。

1 个答案:

答案 0 :(得分:0)

编辑:我相信您正在尝试在一元请求/响应设置中针对一个请求发送两个响应,我认为这是不可能的。相反,您应该执行一元请求和流式响应,这样可以允许许多响应。

客户端

import grpc
import test_pb2_grpc as pb_grpc
import test_pb2 as pb2

def test():
    channel = grpc.insecure_channel('localhost:50051')
    stub = pb_grpc.TestStub(channel=channel)

    for response in stub.Produce(pb2.Empty()):
        print(response.result)

if __name__ == '__main__':
    test()

服务器

import test_pb2_grpc as pb_grpc
import test_pb2 as pb2
import time
import grpc
from concurrent import futures


class test_servcie(pb_grpc.TestServicer):
    def Produce(self, request, context):
        my_method_results = [50, 200]
        for result in my_method_results:
            yield pb2.Resp(result=result)


def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    pb_grpc.add_TestServicer_to_server(test_servcie(), server)
    server.add_insecure_port('[::]:50051')
    print("service started")
    server.start()
    try:
        while True:
            time.sleep(3600)
    except KeyboardInterrupt:
        server.stop(0)


if __name__ == '__main__':
    serve()

原始

syntax = "proto3";

package api;


service Test {
    rpc Produce (Empty) returns (stream Resp);
}

message Empty {}


message Resp{
    int32 result = 1;
}