怎么提高编写并发连接的网络程序

怎么提高编写并发连接的网络程序

我编写了个小程序并发的去连接多个远程主机,但在使用中感觉并发效率不高。我想问下如何提高并发连接到远程主机的效率?我看了的Twisted列子都是作为服务器被动等待连接方式的列子,没有找到作为客户端主动并发连接远程主机的例子,不知道效率怎么样?
非阻塞异步IO目前最效率的网络通信模型


QUOTE:
原帖由 pigvip 于 2008-7-23 22:12 发表
但在使用中感觉并发效率不高

LZ的并发效率指什么
我现在写了个小程序实现并发的连接多个远程主机执行操作,我开始用网上的开源线程池方式使用中发现cpu占用比较高效率低,后来使用了stackless方式发现我的sock方式是同步方式的话效率也很低,stackless需要等待我sock的返回结果后才执行下一段程序,但cpu占用比较低。如果网络超时的话,stackless效率要比线程池方式要低。


QUOTE:
原帖由 reiase 于 2008-7-24 09:43 发表


LZ的并发效率指什么

完成一定数量主机执行命令的操作并把结果输出的时间。
我觉得LZ用stackless方式,再把线程的粒度分细点比较好

网络编程,阻塞方式CPU占用率比较低吧。反正阻塞是由网络决定的,就算换用非阻塞方式,数据没过来有啥用呢。

而且线程池的意义不久在于节约资源吗,你用了线程池反而占用资源了,就说明你的程序还没到需要线程池的地步

LZ程序一般要开多少个连接阿?
我详细说下我的程序吧,主要是使用snmp协议取得远程主机的性能信息。snmp实现使用了开源的pysnmp 2.X版本。采集调度部分使用过threadpool.py和stackless一般方式和数据流2种方式。取远程主机性能部分使用snmp的getnext方式,占用资源比较多的原因是在使用pysnmp的getnext的实现内部使用循环返回结果造成的。一般我采集的一台主机需要取得700个左右oid信息,我做了下测试采集41台主机使用threadpool方式需要3.6分钟左右,而使用stackless方式的话,如果全部主机都可以取得数据的话,会比threadpool需要的时间短一些但不会有太大差距。如果有超时或主机不响应的话,stackless方式时间比threadpool需要的时间长的多。同样是使用pysnmp的getnext,使用threadpool方式,我的双核cpu机器cpu占用50%~60%之间。而使用stackless方式cpu占用10%~30%之间。
才41台机...一台机器开一线程处理吧

线程池处理的问题规模至少要比你这个大一个数量级


QUOTE:
原帖由 pigvip 于 2008-7-24 22:36 发表
如果有超时或主机不响应的话,stackless方式时间比threadpool需要的时间长的多。

这个长得多的原因分析过没
另外,线程池方式的socket工作在非阻塞方式下的吗
stackless方式的socket工作在阻塞方式下吗
貌似线程池都是用在海量的服务器处理中.