断开连接/阻塞中断后,gRPC一元流继续

时间:2017-05-13 03:42:25

标签: python grpc

我有一个简单的一元流方法Subscribe,它在队列中发送连接客户端看到的最新项目。如果一秒内没有推送新项目,则会再次发送最近看到的项目以获取心跳。

class Service(proto_grpc.ServiceServicer):
    def __init__(self, queue):
        self.queue = queue

    def Subscribe(self, request, context):
        index = 0
        state = self.queue.get(index, timeout=None)

        while state:
            temp = self.queue.get(index, timeout=1)
            if temp:
                state = temp
                index = index + 1

            yield state

该计划的其余相关部分如下。

def main(server, queue):
    server.start()

    try:
        while True:
            queue.append('foo')
        time.sleep(1)
    finally:
        server.stop(None)

日志记录显示,如果客户端订阅然后断开连接(非正常),则Subscribe方法将继续处理。新客户似乎也无法使用每个断开连接。

同样奇怪的是,如果服务器进程中断,则服务器停止,客户端断开连接,服务器阻塞yield语句。

处理从流式RPC中删除的非正常客户端的正确方法是什么?

编辑:服务器的简化版本,显示相同的行为。

class Service(proto_grpc.ServiceServicer):
    def Subscribe(self, request, context):
        print 'subscribed'

        while context.is_active():
            time.sleep(1)
            print 'sending'
            yield some_proto_payload
            print 'sent'

        print 'finished'

连接后,'发送/发送'无论客户端的连接状态如何,都将打印对。当服务器在断开连接后停止时,输出会在最后一次发送'之间挂起。和'发送'消息。

0 个答案:

没有答案