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通道/存根线程是不是安全的主要内容,如果未能解决你的问题,请参考以下文章
Python 无法连接到 grpc 通道->“无法连接到所有地址”“grpc_status”:14
如何在 gRPC 服务器存根中从 ctx 创建 OpenTelemetry span