如何在 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
我正在一个永不结束的 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