对于异步双向流,请求迭代器完成迭代后,双向流就会结束,需要保持请求迭代器不结束,才能持续不断的接收消息,可设置特定条件时才停止请求迭代器
参考这段描述(摘自 https://github.com/grpc/grpc/issues/25372)
根据上述描述,可以设置一个stop_event,自己定义结束双向流的条件:
def msg_generator(stop_event: threading.Event):
for i in range(5):
msg = 'test message %s' % i
yield msg
stop_event.wait()
def stop_request_iteration(event: threading.Event):
while True:
flag = input('是否结束(Y/N)?')
if flag == 'Y':
event.set()
break
event = threading.Event()
# 单独开一个线程,监听输入,若输入相应内容,则设置结束信号
t = threading.Thread(target=stop_request_iteration, args=(event,))
t.start()
response_iter = msg_stub.SendMessage(msg_generator(event))
for res in response_iter:
print(res)
结论:只要不结束请求迭代,就能一直保持双向流不结束。因此也可以使生成器不结束迭代,如以下生成器:
def msg_gen():
while True:
msg = input('输入消息内容(输入quit结束迭代):')
if msg == 'quit':
break
yield msg
网友评论