如何使用Python gRPC处理流式消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Python gRPC处理流式消息相关的知识,希望对你有一定的参考价值。

我跟着这个Route_Guide sample

有问题的示例将触发并读取消息,而不回复特定消息。后者是我想要实现的目标。

这是我到目前为止所拥有的:

import grpc
...

channel = grpc.insecure_channel(conn_str)
try:
    grpc.channel_ready_future(channel).result(timeout=5)
except grpc.FutureTimeoutError:
    sys.exit('Error connecting to server')
else:
    stub = MyService_pb2_grpc.MyServiceStub(channel)
    print('Connected to gRPC server.')
    this_is_just_read_maybe(stub)


def this_is_just_read_maybe(stub):
    responses = stub.MyEventStream(stream())
    for response in responses:
        print(f'Received message: {response}')
        if response.something:
            # okay, now what? how do i send a message here?

def stream():
    yield my_start_stream_msg
    # this is fine, i receive this server-side
    # but i can't check for incoming messages here

我似乎没有在存根上的read()write(),一切似乎都用迭代器实现。

我如何从this_is_just_read_maybe(stub)发送消息?这甚至是正确的方法吗?

My Proto是双向流:

service MyService {
  rpc MyEventStream (stream StreamingMessage) returns (stream StreamingMessage) {}
}
答案

您正在尝试做的事情是完全可能的,并且可能涉及编写您自己的请求iterator对象,可以在它们到达时给出响应,而不是使用简单的生成器作为请求迭代器。也许是这样的

class MySmarterRequestIterator(object):

    def __init__(self):
        self._lock = threading.Lock()
        self._responses_so_far = []

    def __iter__(self):
        return self

    def _next(self):
        # some logic that depends upon what responses have been seen
        # before returning the next request message
        return <your message value>

    def __next__(self):  # Python 3
        return self._next()

    def next(self):  # Python 2
        return self._next()

    def add_response(self, response):
        with self._lock:
            self._responses.append(response)

你然后使用像

my_smarter_request_iterator = MySmarterRequestIterator()
responses = stub.MyEventStream(my_smarter_request_iterator)
for response in responses:
    my_smarter_request_iterator.add_response(response)

。你的_next实现中可能会有锁定和阻塞来处理gRPC Python的情况,询问你的对象是否要发送它的下一个请求以及你的响应(实际上)“等待,等待,我不知道是什么请求我想发送,直到我看到下一个响应结果如何“。

以上是关于如何使用Python gRPC处理流式消息的主要内容,如果未能解决你的问题,请参考以下文章

gRPC 客户端流是如何实现的

第七节——实现客户端流式GRPC

第七节——实现客户端流式GRPC

第七节——实现客户端流式GRPC

第八节——实现双向流式GRPC

第八节——实现双向流式GRPC