首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在grpc中add_done_callback的正确方法是什么?

在grpc中add_done_callback的正确方法是什么?
EN

Stack Overflow用户
提问于 2021-05-18 14:35:53
回答 1查看 83关注 0票数 0

如果我add_done_callback一个grpc的未来对象,我需要关闭通道吗?

代码语言:javascript
复制
class CallBack(object):
    def __init__(self,channel=None) -> None:
        self._channel = channel

    def __call__(self, future):
        print(self.future.result())
        # self._channel.close()
def test():
    channel = grpc.insecure_channel('localhost:50051')
    stub = helloworld_pb2_grpc.GreeterStub(channel)
    call_future = stub.SayHello.future(helloworld_pb2.HelloRequest(name='you'))
    call_back = CallBack(channel)
    call_future.add_done_callback(call_back)

如果使用with-statement初始化通道,通道会在回调前关闭。

代码语言:javascript
复制
def test():
    with grpc.insecure_channel('localhost:50051') as channel:
        stub = helloworld_pb2_grpc.GreeterStub(channel)
        call_future = stub.SayHello.future(helloworld_pb2.HelloRequest(name='you'))
        call_back = CallBack(channel)
        call_future.add_done_callback(call_back)

这将引发错误:

代码语言:javascript
复制
cription":"Channel closed!","file":"src/core/lib/surface/call.cc","file_line":727,"grpc_message":"Channel closed!","grpc_status":1}"
EN

回答 1

Stack Overflow用户

发布于 2021-05-20 02:38:39

通常,您需要在某些时候关闭通道。另一种方法是随着时间的推移在进程中增加更多的通道,从而导致每个通道的内存泄漏。使用with语句的第二个示例中的问题是通道在回调有机会触发之前就关闭了。

如果执行回调时不再需要通道,那么您应该从该回调关闭通道,或者设置一点状态来指示另一个线程应该关闭通道。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67581097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档