如何在 python gRPC 客户端中停止监听流

How to stop listening on a stream in python gRPC client

我正在一个永不结束的 gRPC 流上的 python 线程中监听:

responses = some_grpc_stub.FunctionThatReturnsStream()
for response in responses:
  on_event(response)

我想这样做一段时间,然后 停止 监听,这样 on_event 就不会再被调用,可能是在流完成之前。

我该怎么做?有没有正确的方法来杀死这个循环是 运行 的线程?或者有什么方法可以让 responses 过早结束,以便迭代结束并且线程可以 运行 完成?

也许你可以考虑使用cancel()[1]?流式调用 returns 一个既是 Future 又是迭代器的对象,您可以调用 responses.cancel() 来取消它。实际上,这需要在另一个线程中发生,因为迭代器块的消耗。

如果您使用的是 AsyncIO API,则调用流式调用 returns 实现 asyncio.Task 并支持 cancel [2] 的对象。您仍然可以使用 responses.cancel() 停止直播。

[1] https://grpc.github.io/grpc/python/grpc.html#grpc.RpcContext.cancel

[2] https://docs.python.org/3/library/asyncio-task.html#asyncio.Task.cancel