【发布时间】:2021-07-02 18:44:45
【问题描述】:
我正在使用服务器(特别是 python3.8)打开一个 GRPC 双向流。从服务器获取一些数据后,我必须执行一项耗时的任务(大约需要 3 分钟)。在执行此操作时,我会保持通道打开,以便在任务完成后立即将结果发送到服务器
在服务器发出最后一条消息后 1 分钟,我的连接关闭。我得到这个错误
<AioRpcError of RPC that terminated with:
status = StatusCode.INTERNAL
details = "Received RST_STREAM with error code 1"
debug_error_string = "{"created":"@1625250019.779494905","description":"Error received from peer ipv4:3.101.44.139:443","file":"src/core/lib/surface/call.cc","file_line":1066,"grpc_message":"Received RST_STREAM with error code 1","grpc_status":13}"
>
对我来说,这似乎是一些超时。我是grpc的初学者。我参考了this article,并为我的频道提供了文章中指定的客户端选项,每个数字接近 5 分钟。但这并没有改变什么。有人可以帮助我了解这里发生了什么以及我应该如何解决这个问题?
TL;DR
我与服务器的连接是异步安全通道。请注意,我的两个流是独立的,这就是为什么我必须这样做async
channel=grpc.aio.secure_channel(address, credentials=creds, options=options)
我有两个协程,一个等待长时间运行的任务执行,另一个在双向流上接收和感知消息
def parse_response(resp):
# collect data from server response
# make `task_available=True` when all data is received
async def stream_handler():
stub = TaskServiceStub(channel)
req_gen = get_requests() # An async generator for request messages
stream: grpc.aio.StreamStreamCall = stub.Task(req_gen)
async for resp in stream.__aiter__():
parse_response(resp)
async def task_handler():
if task_available:
do_task()
async def main():
await asyncio.gather(stream_handler(), task_handler())
【问题讨论】:
-
RST_STREAM是客户端发送的取消请求,客户端通道中的选项是什么?并检查客户端日志,是否还有其他问题导致请求失败? -
我不确定客户端是否关闭了连接,如果这是您的暗示的话。查看答案
标签: python asynchronous grpc bidirectional grpc-python