##language:zh ''' benchmarks ''' -- Zoom.Quiet [<<DateTime(2004-08-09T23:57:27Z)>>] <<TableOfContents>> = 优化讨论 = 主要针对客户端 * [[b%gnsq1]]--Benchmarks/gnsd|c 测试1 == 0729版本 == {{{ #!python # -*- coding: utf-8 -*- # # # $Id: ussc.py,v 1.3 2004/07/28 10:23:34 hd Exp $ from uss.message import usspmsg from uss.protocols import ussp from twisted.internet import reactor, protocol, defer from time import clock class USSClientProtocol(ussp.USSProtocol): def connectionMade(self): message = usspmsg.USSPMessage() message.setMsgName('connect') message.body.setField('system_id','123456') message.body.setField('auth_source','1234567890123456') message.body.setField('version',0x0100) message.body.setField('time_stamp','12345678') self.sendData(message.packed()) def on_ussp_connect_resp(self, message): print "Connect successfully" global nownum global count # while (nownum < count): defer.succeed(self.testserver(str(nownum))) # nownum += 1 # if(nownum >= count) # self.disconnect() def on_ussp_terminate_resp(self, message): # 完事了!!!断开丫的连接 self.transport.loseConnection() def on_ussp_mail_counter_resp(self, message): global getnum global lastuid global nownum lastuid = message.body.fields['uid'] getnum += 1 if getnum >= count: self.disconnect() nownum += 1 defer.succeed(self.testserver(str(nownum))) def testserver(self,uid): message = usspmsg.USSPMessage() message.setMsgName('mail_counter') message.body.setField('uid',uid) self.sendData(message.packed()) def disconnect(self): message = usspmsg.USSPMessage() message.setMsgName('terminate') self.sendData(message.packed()) class USSClientFactory(protocol.ClientFactory): protocol = USSClientProtocol def clientConnectionFailed(self, connector, reason): print "Connection failed - goodbye!" reactor.stop() def clientConnectionLost(self, connector, reason): print "Connection lost" reactor.stop() pass def main(): f = USSClientFactory() global count count = 0xffff global nownum nownum = 0 global lastuid lastuid = '' global getnum getnum = 0 reactor.connectTCP("127.0.0.1", 7890, f) start = clock() reactor.run() print "测试数据:%10d 条" %nownum print "收到 %d 条" %getnum print "最后收到uid为:%s" %lastuid print "用时:%.2f 秒" %(clock()-start) print "每秒: %.2f 条" %(getnum / (clock()-start)) if __name__ == "__main__": main() }}} == 0731版本 == {{{ #!python # -*- coding: utf-8 -*- # # # $Id: ussc.py,v 1.5 2004/07/29 08:02:06 hd Exp $ from uss.message import usspmsg from uss.protocols import ussp from twisted.internet import reactor, protocol, defer from time import clock import Queue # 定义了滑动窗口的大小 WINMAX = 1024 class USSClientProtocol(ussp.USSClientQueueProtocol): """建立一个USS客户机的协议处理""" def connectionMade(self): """连接成功后开始发送报文""" # 先发一个connect报文进行握手 message = usspmsg.USSPMessage() message.setMsgName('connect') message.body.setField('system_id','123456') message.body.setField('auth_source','1234567890123456') message.body.setField('version',0x0100) message.body.setField('time_stamp','12345678') self.sendDataToQueue(message) ussp.USSClientQueueProtocol.connectionMade(self) def on_ussp_connect_resp(self, message): """服务器返回了connect的resp报文""" print "Connect successfully" defer.succeed(self.testserver()) def on_ussp_terminate_resp(self, message): # 完事了!!!断开丫的连接 self.transport.loseConnection() def on_ussp_mail_counter_resp(self, message): """服务器返回了mail_counter的resp报文""" global getnum global lastuid lastuid = message.body.fields['uid'] getnum += 1 def testserver(self): """向服务器发的测试报文""" global nownum global count while nownum < count: message = usspmsg.USSPMessage() message.setMsgName('mail_counter') message.body.setField('uid',str(nownum)) if self.factory.sendQueue.full(): self.call = reactor.callLater(0, self.testserver) return else: self.factory.sendQueue.put_nowait(message) nownum += 1 self.disconnect() def disconnect(self): """发完测试报文后发送terminate报文让服务器断开连接""" message = usspmsg.USSPMessage() message.setMsgName('terminate') self.sendDataToQueue(message) class USSClientFactory(protocol.ClientFactory): protocol = USSClientProtocol def __init__(self): # 滑动窗口的大小 self.WINMAX = WINMAX # 等待发送的报文队列 self.sendQueue = Queue.Queue(self.WINMAX) # 已经发出的报文序列ID self.sendMsg = [] # 使用的消息ID self.sequence = 1 def clientConnectionFailed(self, connector, reason): print "Connection failed - goodbye!" reactor.stop() def clientConnectionLost(self, connector, reason): print "Connection lost" reactor.stop() pass def main(): f = USSClientFactory() global count count = 0xffff global nownum nownum = 0 global lastuid lastuid = '' global getnum getnum = 0 reactor.suggestThreadPoolSize(30) reactor.connectTCP("192.168.2.237", 7890, f) #reactor.connectTCP("127.0.0.1", 7890, f) start = clock() reactor.run() print "测试数据:%10d 条" %nownum print "收到 %d 条" %getnum print "最后收到uid为:%s" %lastuid print "用时:%.2f 秒" %(clock()-start) print "每秒:%f条" %(nownum / (clock()-start)) if __name__ == "__main__": main() }}} === ussp.py === {{{ #!python # -*- coding: utf-8 -*- # # # $Id: ussp.py,v 1.2 2004/07/28 08:36:29 hd Exp $ """Open Unified Storage System Protocol Stability: None @author: U{HD<mailto:hdcola@gmail.com>} @see: Open Unified Storage System Protocol规范 """ from uss.protocols import byteprotocol from uss.message import usspmsg from twisted.internet import reactor class USSProtocol(byteprotocol.ByteMessageProtocol): """缺省USS协议实现""" def MessageReceived(self,packet): """接收到一条消息,对该消息进行处理""" message = usspmsg.USSPMessage() message.loadMessage(packet) # print message self.MessageProcess(message) def MessageProcess(self, message): """调用指定的方法来处理收到的消息""" method = getattr(self , "on_ussp_%s" % message.msgname, None) return method(message) class USSClientQueueProtocol(USSProtocol): """使用滑动窗口队列的USS协议客户端实现""" def MessageReceived(self,packet): """接收到一条消息,确定该消息是否是已发送出的消息, 如果是,从发送消息队列中清除该消息。然后按正常的流程执行下去。 """ message = usspmsg.USSPMessage() message.loadMessage(packet) # print message # 将发出的消息从队列中清楚 self.factory.sendMsg.remove(message.head.sequence) self.MessageProcess(message) def connectionMade(self): """连接成功了,就可以启动发送线程了""" reactor.callInThread(self.sendQueueMesg) def sendDataToQueue(self, message): """将消息加入待发送队列""" if(not self.factory.sendQueue.full()): self.factory.sendQueue.put(message) else: self.call = reactor.callLater(0, self.sendDataToQueue, message) def sendQueueMesg(self): """将队列中的消息发送出去""" if (len(self.factory.sendMsg) < self.factory.WINMAX): while (not self.factory.sendQueue.empty()): message = self.factory.sendQueue.get() # 发送前设置消息的顺序号 message.head.sequence = self.factory.sequence self.sendData(message.packed()) # 将已经发送的消息放入已经发送的清单中 self.factory.sendMsg.append(self.factory.sequence) self.factory.sequence += 1 self.call = reactor.callLater(0, self.sendQueueMesg) }}}