.net core 是否可以确定Thrift TBaseClient当前是否繁忙或可用? 我们的系统中,有一个C++组件作为一个节省服务器,一个磊科/C组件作为客户端。 到目前为止,我只管理一个连接,所以使用一个单例来创建我的ThriftPushClientWrapper,它实现了TBaseClient。(通过thrift界面生成的对象) .AddSingleton(sp=> { var localIpAddress=IPAddress.Parse(serverIp); var transport=新的TSocketTransport(localIpAddress,数据端口); var协议=新的TBinaryProtocol(传输); 返回新的ThriftPushClientWrapper(协议); });
(到目前为止,使用Thrift library的0.13版本,需要很快更新到0.14.1,但不知道是否必须先更新服务器部分)。 这很有效 现在,我希望多个客户端可以同时连接到服务器,所有客户端都位于同一ip:端口上 所以我开始创建一个ClientFactory,但不知道如何处理客户机的创建。 更准确地说,服务器部分配置为5个线程,所以我需要5个客户端 一种简单的方法是每次创建一个新客户机,但可能效率低下 更好的方法是收集5个客户端,然后使用下一个可用的免费客户端。 所以我从下面的工厂开始,在那里我应该从外部获取索引.net core 是否可以确定Thrift TBaseClient当前是否繁忙或可用? 我们的系统中,有一个C++组件作为一个节省服务器,一个磊科/C组件作为客户端。 到目前为止,我只管理一个连接,所以使用一个单例来创建我的ThriftPushClientWrapper,它实现了TBaseClient。(通过thrift界面生成的对象) .AddSingleton(sp=> { var localIpAddress=IPAddress.Parse(serverIp); var transport=新的TSocketTransport(localIpAddress,数据端口); var协议=新的TBinaryProtocol(传输); 返回新的ThriftPushClientWrapper(协议); });,.net-core,thrift,.net Core,Thrift,(到目前为止,使用Thrift library的0.13版本,需要很快更新到0.14.1,但不知道是否必须先更新服务器部分)。 这很有效 现在,我希望多个客户端可以同时连接到服务器,所有客户端都位于同一ip:端口上 所以我开始创建一个ClientFactory,但不知道如何处理客户机的创建。 更准确地说,服务器部分配置为5个线程,所以我需要5个客户端 一种简单的方法是每次创建一个新客户机,但可能效率低下 更好的方法是收集5个客户端,然后使用下一个可用的免费客户端。 所以我从下面的工厂开始,在那里
private readonly ConcurrentDictionary<int, IThriftPushClientWrapper> _clientDict;
public IThriftPushClientWrapper GetNextAvailablePushClient(int index)
{
IThriftPushClientWrapper client;
if (_clientDict.ContainsKey(index))
{
if (_clientDict.TryGetValue(index, out client) && client != null)
return client;
else // error handling
}
// add new client for the expecting index
client = CreateNewPushClient();
_clientDict.TryAdd(index, client);
return client;
}
private IThriftPushClientWrapper CreateNewPushClient()
{
var localIpAddress = IPAddress.Parse(serverIp);
var transport = new TSocketTransport(localIpAddress, dataPort);
var protocol = new TBinaryProtocol(transport);
return new ThriftPushClientWrapper(protocol);
}
专用只读ConcurrentDictionary\u clientDict;
公共IThriftPushClientWrapper GetNextAvailablePushClient(int索引)
{
IThriftPushClientWrapper客户端;
如果(_clientDict.ContainsKey(索引))
{
if(_clientDict.TryGetValue(索引,输出客户端)&&client!=null)
返回客户;
else//错误处理
}
//为预期索引添加新客户端
client=CreateNewPushClient();
_clientDict.TryAdd(索引,客户);
返回客户;
}
私有IThriftPushClientWrapper CreateNewPushClient()
{
var localIpAddress=IPAddress.Parse(serverIp);
var transport=新的TSocketTransport(localIpAddress,数据端口);
var协议=新的TBinaryProtocol(传输);
返回新的ThriftPushClientWrapper(协议);
}
我的下一个问题是确定如何从外部设置索引。
我从使用semaphore.CurrentCount作为索引的SemaphoreSlim(5,5)开始,但这可能不是最好的主意。还尝试使用从0到5的滚动索引。但显然,CancellationToken用于取消进一步的处理。还不确定根本原因
是否可以确定TBaseClient当前是否繁忙或可用
处理客户群的推荐策略是什么?解决这一问题的最简单方法是正确地处理。如果您要使用资源池中的某些资源,请将其从资源池中取出,或者以某种适当的方式将其标记为已使用 值得注意的是,这个问题与节俭无关。您正试图通过尝试利用其他人的代码来解决资源管理方法薄弱的问题,这些代码从未打算在这样的环境中工作
关于如何实现对象池,可以提供进一步的建议。还要记住,特别是在Windows平台上,并非所有系统资源都可以跨线程自由共享。谢谢您的评论。我的问题就是:如何正确地做?我们有如何并行处理多个连接的示例吗?我主要回答了这个问题。更准确地说,我试图通过提供更好的信息来规避真正的答案,并且(现在)添加了一个合适的stackoverflow链接。这个问题的真正答案是“你不需要知道”。资源从池中取出后会变得繁忙,当您将其放回池中时会再次可用,这就是我们想要知道的。感谢您的链接,这给了我一些想法。hanks JensG感谢您为.NET world带来节俭的惊人工作!请确认Thrift支持在同一端口上同时进行多个连接,并且具有多个“客户端的传输对象?我在这里只处理客户端部分,我还需要与同事同步他们的服务器部分…太荣幸了,这真是团队合作。Thrift使用标准的系统资源,不涉及特殊的魔法——套接字、http、管道——随便你说。
private readonly ConcurrentDictionary<int, IThriftPushClientWrapper> _clientDict;
public IThriftPushClientWrapper GetNextAvailablePushClient(int index)
{
IThriftPushClientWrapper client;
if (_clientDict.ContainsKey(index))
{
if (_clientDict.TryGetValue(index, out client) && client != null)
return client;
else // error handling
}
// add new client for the expecting index
client = CreateNewPushClient();
_clientDict.TryAdd(index, client);
return client;
}
private IThriftPushClientWrapper CreateNewPushClient()
{
var localIpAddress = IPAddress.Parse(serverIp);
var transport = new TSocketTransport(localIpAddress, dataPort);
var protocol = new TBinaryProtocol(transport);
return new ThriftPushClientWrapper(protocol);
}