繁体   English   中英

grpc WriteAsync 锁定服务器

[英]grpc WriteAsync locking up server

Grpc.Core 2.38.0

我有一组使用 grpc 流参与进程间通信的应用程序。 我们不时注意到服务器进程中的锁定和内存耗尽(由于锁定)无法完成对IAsyncStreamWriter.WriteAsync(...)的调用

最近对 grpc (.net) 的更改WriteAsync API 更改为接受CancellationToken ,但这在Grpc.Core包中不可用。

接受流的配置错误的 grpc 客户端可能会导致死锁。 如果客户端在错误处理过程中没有处理AsyncServerStreamingCall ,那么服务端就会发生死锁。

例子:

async Task ClientStreamingThread()
{
    while (...)
    {
        var theStream = grpcService.SomeStream(new());
        try
        {
            while (await theStream.ResponseStream.MoveNext(shutdownToken.Token))
            {
                var theData = theStream.ResponseStream.Current;
            }
        }
        catch (RpcException)
        {
            // if an exception occurs, start over, reopen the stream
        }
    }
}

上面的示例包含行为不端的客户端。 如果发生RpcException ,我们将返回到 while 循环的开头并打开另一个流而不清理前一个流。 这会导致死锁。

通过处置前一个流来“修复”客户端代码,如下所示:

async Task ClientStreamingThread()
{
    while (...)
    {
        // important.  dispose of theStream if it goes out of scope
        using var theStream = grpcService.SomeStream(new());
        try
        {
            while (await theStream.ResponseStream.MoveNext(shutdownToken.Token))
            {
                var theData = theStream.ResponseStream.Current;
            }
        }
        catch (RpcException)
        {
            // if an exception occurs, start over, reopen the stream
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM