grpc通道线程在csharp中是安全的吗,或者更普遍地说,在任何依赖于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();发布于 2018-03-13 11:25:20
是的,在csharp中,通道和客户端(其他语言的存根)都是线程安全的。
通道是到远程服务器的长期连接的抽象。更多的客户端对象可以重用相同的通道,即使对于不同的gRPC服务器,只要它们具有相同的地址(例如,在Kubernetes中使用Envy as sidecar,服务器地址都是localhost:envoy-port)。
文档明确指出,与调用远程调用相比,创建通道是一项开销很大的操作,因此,通常情况下,您应该为尽可能多的调用重用单个通道。这是它的source code。你可以看到它的共享数据可以被多个线程安全地访问。
客户端的基类ClientBase<T>和ClientBase都是线程安全的,您可以从它们的source code中进行验证。因此,如果您只使用自动生成的截取程序,那么客户端是线程安全的,并且您添加的客户端截取程序也是线程安全的。
https://stackoverflow.com/questions/48070469
复制相似问题