c/s开发了一个定时根据IP获取硬件信息的服务器程序,目前用的后台单线程处理,每2分钟获取一次,全部IP处理完需要30秒左右,领导说慢了不能接受,而且后期应该会增加ip地址,所以以后可能会更慢。目前我的想法是一个ip开辟一个线程,但是我有些疑惑的是使用多线程还是使用线程池?
ip地址最多情况下有200个左右
分不多,望大神解惑!
能讲讲你如何根据 IP 获取硬件信息的吗?
用的TCP协议,根据IP发送指令,硬件那边接收到之后会返回16进制数组,解析成数值就可以了!
@笨鸟先跑: 实际上你是开发了一个 Socket 客户端程序,此客户端需要连接多个 Server 获取数据,同时每个 Server 需要周期性的调用。
针对每个单独的 Server,你有两种连接模型可以采用,一是每次获取完数据后断开连接,二是至道连接不可用时才重新建立连接。在获取数据上,后者比前者性能好,因为不用每次都连接;但是需要更多的内存来保持连接,同时也要求服务器始终保持一条空闲连接。你需要根据你们的场景来衡量。
由于你已经开始考虑性能问题,因此我建议你使用 Socket 的 xxxAsync 样式的 API,不用为每个 IP 开辟一个线程,你需要学会使用异步模式来处理。
@Launcher:谢谢您,按照现在的场景我想了一下肯定会选择第一个模型处理!
最开始用的异步连接和处理数据,个人能力不足(现学现卖),不知道为什么读取几个后就有脏数据了!说来惭愧,不知道哪里出了问题才改成了同步连接,(PS,不过问题倒是解决了,就是速度慢了许多。。。。汗)!!!
话说 Socket 的 xxxAsync 样式的 API?这是什么东东?
@笨鸟先跑: 随着你的 IP 数的增加,你必须采用异步模式。不论你是“使用多线程还是使用线程池”,被 I/O 访问阻塞的线程越多,你的程序的性能越低。因此,你必须学会 TCP 和异步 I/O 模型。
方法名以 Async 结尾的,或者你也可以采用方法名义 Begin 和 End 开始的:
https://msdn.microsoft.com/zh-cn/library/System.Net.Sockets.Socket_methods(v=vs.110).aspx
@Launcher: 好的,谢大神。