接收流时中断python grpc客户端

时间:2018-01-25 17:19:06

标签: python queue python-multithreading grpc

我正在玩gRPC,我不知道如何在接收流时关闭客户端和服务器之间的连接。客户端和服务器都是用Python编写的。

例如,我的服务器从队列中读取消息并生成每条消息。我的想法是客户端订阅服务器并开始接收这些消息。

我的问题是:

  • 我想在按下CTRL + C时让客户端死机,但它会被当前代码卡住。如何正确完成?
  • 服务器如何意识到客户端已停止监听?

我的nbi.proto文件:

syntax = "proto3";
service Messenger {
    rpc subscribe(Null) return (stream Message) {}
}

message Null {}

message Message {
    string value = 1;
}

Python客户端:

import test_pb2_grpc as test_grpc
import test_pb2 as test
import grpc

def run():
    channel = grpc.insecure_channel('localhost:50051')
    stub = test_grpc.MessengerStub(channel)

    stream = stub.subscribe(test.Null())
    try:
        for e in stream:
            print e
    except grpc._channel._Rendezvous as err:
        print err
    except KeyboardInterrupt:
        stub.unsuscribe(test.Null)

Python服务器:

import test_pb2_grpc as test_grpc
import test_pb2 as test
from Queue import Empty
import grpc

class Messenger(test_grpc.MessengerServicer):
    def __init__(self, queue):
        self.queue = queue

    def subscribe(self, request, context):
        while True:
            try:
                yield self.queue.get(block=True, timeout=0.1)
            except Empty:
                continue
            except Exception as e:
                logger.error(e)
                break
        return

1 个答案:

答案 0 :(得分:3)

  

我想在按下CTRL + C时杀死客户端,但是   它被当前的代码卡住了。如何正确完成?

KeyboardInterrupt应足以终止客户端应用程序。这个过程可能挂在stub.unsubscribe上。如果您使用客户端断开连接回调,也许您不需要明确取消订阅。

  

服务器如何意识到客户端已停止监听?

您可以add a callback to the context object传递给Messenger.subscribe方法。在客户端断开连接时调用回调。

顺便说一句,您可以使用empty.proto代替Null类型。