首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在csharp中,grpc通道/存根线程是否安全

问在csharp中,grpc通道/存根线程是否安全
EN

Stack Overflow用户
提问于 2018-01-03 10:39:04
回答 1查看 2.5K关注 0票数 4

grpc通道线程在csharp中是安全的吗,或者更普遍地说,在任何依赖于C核心版本的语言中都是安全的;

对于以下代码: 1)通道线程安全吗? 2)客户端线程安全吗?

代码语言:javascript
复制
        Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure);

        Task task1 = Task.Factory.StartNew(() =>
        {

            var client = new Greeter.GreeterClient(channel);
            String user = "you";
            var reply = client.SayHello(new HelloRequest {Name = user});
            Console.WriteLine("Greeting: " + reply.Message);
        });

        Task task2 = Task.Factory.StartNew(() =>
        {

            var client = new Greeter.GreeterClient(channel);
            String user = "you";
            var secondReply = client.SayHelloAgain(new HelloRequest {Name = user});
            Console.WriteLine("Greeting: " + secondReply.Message);

        });

        task1.Wait();
        task2.Wait();
        channel.ShutdownAsync().Wait();
        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
EN

回答 1

Stack Overflow用户

发布于 2018-03-13 11:25:20

是的,在csharp中,通道和客户端(其他语言的存根)都是线程安全的。

通道是到远程服务器的长期连接的抽象。更多的客户端对象可以重用相同的通道,即使对于不同的gRPC服务器,只要它们具有相同的地址(例如,在Kubernetes中使用Envy as sidecar,服务器地址都是localhost:envoy-port)。

文档明确指出,与调用远程调用相比,创建通道是一项开销很大的操作,因此,通常情况下,您应该为尽可能多的调用重用单个通道。这是它的source code。你可以看到它的共享数据可以被多个线程安全地访问。

客户端的基类ClientBase<T>和ClientBase都是线程安全的,您可以从它们的source code中进行验证。因此,如果您只使用自动生成的截取程序,那么客户端是线程安全的,并且您添加的客户端截取程序也是线程安全的。

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

https://stackoverflow.com/questions/48070469

复制
相关文章

相似问题

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