csharp中的grpc通道/存根线程是不是安全

Posted

技术标签:

【中文标题】csharp中的grpc通道/存根线程是不是安全【英文标题】:Is grpc channel/stub thread safe in csharpcsharp中的grpc通道/存根线程是否安全 【发布时间】:2018-06-12 17:16:40 【问题描述】:

在 csharp 中 grpc 通道线程是安全的,或者更一般地说,在任何语言中取决于 C 核心版本;

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

        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();

【问题讨论】:

可能是重复的:***.com/q/33197669/1531971 BTW,C# API 和运行时本质上与 C 无关。 我注意到了,但不确定在 c# 中是否相同 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于csharp中的grpc通道/存根线程是不是安全的主要内容,如果未能解决你的问题,请参考以下文章

存根的 gRPC 并发

Python 无法连接到 grpc 通道->“无法连接到所有地址”“grpc_status”:14

如何在 gRPC 服务器存根中从 ctx 创建 OpenTelemetry span

检查 gRPC 流何时为空或不是流式传输数据

Python 客户端在 GRPC 存根上返回 CERTIFICATE_VERIFY_FAILED

.Net Core gRPC 实战