我有一个简单的一元流方法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'
连接后,'发送/发送'无论客户端的连接状态如何,都将打印对。当服务器在断开连接后停止时,输出会在最后一次发送'之间挂起。和'发送'消息。