﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-PYTHON爱好者</title><link>http://www.cnitblog.com/donne/</link><description>PYTHON, twisted, 网络编程。</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 06:00:28 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 06:00:28 GMT</pubDate><ttl>60</ttl><item><title>Twisted中启动子进程及进程间通信方式</title><link>http://www.cnitblog.com/donne/archive/2011/11/16/76327.html</link><dc:creator>Don Li</dc:creator><author>Don Li</author><pubDate>Wed, 16 Nov 2011 08:32:00 GMT</pubDate><guid>http://www.cnitblog.com/donne/archive/2011/11/16/76327.html</guid><wfw:comment>http://www.cnitblog.com/donne/comments/76327.html</wfw:comment><comments>http://www.cnitblog.com/donne/archive/2011/11/16/76327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/donne/comments/commentRss/76327.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/donne/services/trackbacks/76327.html</trackback:ping><description><![CDATA[1. main.py:<br /><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #008000; ">#</span><span style="color: #008000; ">!/bin/env python</span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 2</span> <span style="color: #008000; ">#</span><span style="color: #008000; ">-*-coding:utf-8-*-</span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 3</span> <span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> sys<br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">from</span><span style="color: #000000; "> twisted.python </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> log<br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">log.startLogging(sys.stdout)<br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">from</span><span style="color: #000000; "> twisted.internet </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> protocol, reactor<br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> SubProcessProtocol(protocol.ProcessProtocol):<br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> </span><span style="color: #800080; ">__init__</span><span style="color: #000000; ">(self):<br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">        self.input </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">97</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> connectionMade(self):<br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">        log.msg(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Connection Made.</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">        self.send()<br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> send(self):<br /></span><span style="color: #008080; ">19</span> <span style="color: #000000; ">        self.transport.write(chr(self.input) </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #800000; ">"</span><span style="color: #800000; ">\n</span><span style="color: #800000; ">"</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">        log.msg(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Sent:</span><span style="color: #800000; ">'</span><span style="color: #000000; ">, chr(self.input))<br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">        self.input </span><span style="color: #000000; ">+=</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">23</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> outReceived(self, data):<br /></span><span style="color: #008080; ">24</span> <span style="color: #000000; ">        log.msg(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Received:</span><span style="color: #800000; ">'</span><span style="color: #000000; ">, data)<br /></span><span style="color: #008080; ">25</span> <span style="color: #000000; ">        reactor.callLater(.</span><span style="color: #000000; ">1</span><span style="color: #000000; ">, self.send)<br /></span><span style="color: #008080; ">26</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">27</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> errReceived(self, data):<br /></span><span style="color: #008080; ">28</span> <span style="color: #000000; ">        log.msg(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Error:</span><span style="color: #800000; ">'</span><span style="color: #000000; ">, data)<br /></span><span style="color: #008080; ">29</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">30</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> inConnectionLost(self):<br /></span><span style="color: #008080; ">31</span> <span style="color: #000000; ">        log.msg(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Error: inConnectionLost</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">32</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">33</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> outConnectionLost(self):<br /></span><span style="color: #008080; ">34</span> <span style="color: #000000; ">        log.msg(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Error: inConnectionLost</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">35</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">36</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> errConnectionLost(self):<br /></span><span style="color: #008080; ">37</span> <span style="color: #000000; ">        log.msg(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Error: errConnectionLost</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">38</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">39</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> processExited(self, reason):<br /></span><span style="color: #008080; ">40</span> <span style="color: #000000; ">        log.msg(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Process exit status:</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,reason.value.exitCode )<br /></span><span style="color: #008080; ">41</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">42</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> processEnded(self, reason):<br /></span><span style="color: #008080; ">43</span> <span style="color: #000000; ">        log.msg(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Process end status:</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,reason.value.exitCode )<br /></span><span style="color: #008080; ">44</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> reactor.running:<br /></span><span style="color: #008080; ">45</span> <span style="color: #000000; ">            reactor.stop()<br /></span><span style="color: #008080; ">46</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">47</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> main():<br /></span><span style="color: #008080; ">48</span> <span style="color: #000000; ">    p </span><span style="color: #000000; ">=</span><span style="color: #000000; "> SubProcessProtocol()<br /></span><span style="color: #008080; ">49</span> <span style="color: #000000; ">    reactor.spawnProcess(p, </span><span style="color: #800000; ">'</span><span style="color: #800000; ">sub.py</span><span style="color: #800000; ">'</span><span style="color: #000000; ">, [</span><span style="color: #800000; ">'</span><span style="color: #800000; ">sub.py</span><span style="color: #800000; ">'</span><span style="color: #000000; ">], {})<br /></span><span style="color: #008080; ">50</span> <span style="color: #000000; ">    reactor.run()<br /></span><span style="color: #008080; ">51</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">52</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> </span><span style="color: #800080; ">__name__</span><span style="color: #000000; "> </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #800000; ">"</span><span style="color: #800000; ">__main__</span><span style="color: #800000; ">"</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">53</span> <span style="color: #000000; ">    main()</span></div><br />2. sub.py:<br /><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; "> 1</span> <span style="color: #008000; ">#</span><span style="color: #008000; ">!/bin/env python</span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 2</span> <span style="color: #008000; ">#</span><span style="color: #008000; ">-*-coding:utf-8-*-</span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 3</span> <span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> sys, os<br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">sys.stdout </span><span style="color: #000000; ">=</span><span style="color: #000000; "> os.fdopen(sys.stdout.fileno(), </span><span style="color: #800000; ">'</span><span style="color: #800000; ">w</span><span style="color: #800000; ">'</span><span style="color: #000000; ">, </span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> main():<br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">    running </span><span style="color: #000000; ">=</span><span style="color: #000000; "> True<br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> running:<br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">        input </span><span style="color: #000000; ">=</span><span style="color: #000000; "> sys.stdin.readline().rstrip(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">\n</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> input </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #800000; ">'</span><span style="color: #800000; ">q</span><span style="color: #800000; ">'</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">            running </span><span style="color: #000000; ">=</span><span style="color: #000000; "> False<br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">print</span><span style="color: #000000; "> </span><span style="color: #800000; ">"</span><span style="color: #800000; ">You said:%s</span><span style="color: #800000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; ">%</span><span style="color: #000000; "> input<br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> </span><span style="color: #800080; ">__name__</span><span style="color: #000000; "> </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #800000; ">"</span><span style="color: #800000; ">__main__</span><span style="color: #800000; ">"</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">19</span> <span style="color: #000000; ">    main()<br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">    sys.exit(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)</span></div><br /><br /><br /><img src ="http://www.cnitblog.com/donne/aggbug/76327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/donne/" target="_blank">Don Li</a> 2011-11-16 16:32 <a href="http://www.cnitblog.com/donne/archive/2011/11/16/76327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于测试Python不释放内存的测试代码</title><link>http://www.cnitblog.com/donne/archive/2011/09/28/75671.html</link><dc:creator>Don Li</dc:creator><author>Don Li</author><pubDate>Wed, 28 Sep 2011 08:32:00 GMT</pubDate><guid>http://www.cnitblog.com/donne/archive/2011/09/28/75671.html</guid><wfw:comment>http://www.cnitblog.com/donne/comments/75671.html</wfw:comment><comments>http://www.cnitblog.com/donne/archive/2011/09/28/75671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/donne/comments/commentRss/75671.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/donne/services/trackbacks/75671.html</trackback:ping><description><![CDATA[memtest.py:<br /><div style="background-color:#eeeeee;font-size:13px;BORDER:1px solid #CCCCCC;PADDING-RIGHT: 5px;PADDING-BOTTOM: 4px;PADDING-left: 4px;PADDING-TOP: 4px;WIDTH: 98%;word-break:break-all"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000; ">#</span><span style="color: #008000; ">!/usr/bin/env python</span><span style="color: #008000; "><br />#</span><span style="color: #008000; ">-*-coding: utf8-*-</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">from</span><span style="color: #000000; "> datetime </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> datetime<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> gc<br /><br />d </span><span style="color: #000000; ">=</span><span style="color: #000000; "> {}<br />ck </span><span style="color: #000000; ">=</span><span style="color: #000000; "> 0<br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> O:<br />    </span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> </span><span style="color: #800080; ">__init__</span><span style="color: #000000; ">(self, id):<br />        self.id </span><span style="color: #000000; ">=</span><span style="color: #000000; "> id<br />        self.v  </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #008000; ">#</span><span style="color: #008000; ">range(10)</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> log(func):<br />    </span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> new_f(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">args, </span><span style="color: #000000; ">**</span><span style="color: #000000; ">kwargs):<br />        header </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #800000; ">"</span><span style="color: #800000; ">*[ OUTPUT][%s]:</span><span style="color: #800000; ">"</span><span style="color: #000000; "> <br />        </span><span style="color: #0000FF; ">print</span><span style="color: #000000; "> header </span><span style="color: #000000; ">%</span><span style="color: #000000; "> datetime.now(), func(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">args, </span><span style="color: #000000; ">**</span><span style="color: #000000; ">kwargs), memory()<br />    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> new_f<br /><br />@log<br /></span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> err(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">msg):<br />    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #800000; ">'</span><span style="color: #800000; ">[*ERROR*][%s]:</span><span style="color: #800000; ">'</span><span style="color: #000000; "> </span><span style="color: #000000; ">%</span><span style="color: #000000; "> msg<br /><br /></span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> memory():<br />    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> os<br />    _cmd </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #800000; ">'</span><span style="color: #800000; ">ps u -p %s</span><span style="color: #800000; ">'</span><span style="color: #000000; "> </span><span style="color: #000000; ">%</span><span style="color: #000000; "> os.getpid()<br />    exec_result </span><span style="color: #000000; ">=</span><span style="color: #000000; "> os.popen(_cmd).readlines()<br />    mem_used </span><span style="color: #000000; ">=</span><span style="color: #000000; "> exec_result[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">].split()[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]<br />    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #800000; ">'</span><span style="color: #800000; ">Memory used: </span><span style="color: #800000; ">'</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; ">  mem_used </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #800000; ">'</span><span style="color: #800000; ">%</span><span style="color: #800000; ">'</span><span style="color: #000000; ">, </span><span style="color: #800000; ">'</span><span style="color: #800000; ">Objects:</span><span style="color: #800000; ">'</span><span style="color: #000000; ">, len(gc.get_objects())<br /><br />@log<br /></span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> add(cnt, obj):<br />    </span><span style="color: #0000FF; ">global</span><span style="color: #000000; "> ck<br />    i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> 0<br />    cnt </span><span style="color: #000000; ">=</span><span style="color: #000000; "> int(cnt)<br /><br />    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> d:<br />        max_key </span><span style="color: #000000; ">=</span><span style="color: #000000; "> max(d.keys())<br />    </span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">:<br />        max_key </span><span style="color: #000000; ">=</span><span style="color: #000000; "> ck<br /><br />    </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> i </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; "> cnt:<br />        i </span><span style="color: #000000; ">+=</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; "><br />        c_key </span><span style="color: #000000; ">=</span><span style="color: #000000; "> max_key </span><span style="color: #000000; ">+</span><span style="color: #000000; "> i<br />        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> obj:<br />            d[c_key] </span><span style="color: #000000; ">=</span><span style="color: #000000; "> O(c_key)<br />        </span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">:<br />            d[c_key] </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #800000; ">'</span><span style="color: #800000; ">dictionary %s</span><span style="color: #800000; ">'</span><span style="color: #000000; "> </span><span style="color: #000000; ">%</span><span style="color: #000000; "> c_key<br /><br />    ck </span><span style="color: #000000; ">=</span><span style="color: #000000; "> c_key<br /><br />    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #800000; ">'</span><span style="color: #800000; ">Dictionary length:</span><span style="color: #800000; ">'</span><span style="color: #000000; ">, len(d)<br /><br />@log<br /></span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> clear():<br />    </span><span style="color: #0000FF; ">global</span><span style="color: #000000; "> d<br />    </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> k </span><span style="color: #0000FF; ">in</span><span style="color: #000000; "> d.keys():<br />        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> isinstance(d[k], O):<br />            </span><span style="color: #0000FF; ">del</span><span style="color: #000000; "> d[k].v<br />        </span><span style="color: #0000FF; ">del</span><span style="color: #000000; "> d[k]<br /><br />    gc.collect()<br />    </span><span style="color: #0000FF; ">del</span><span style="color: #000000; "> d<br />    d </span><span style="color: #000000; ">=</span><span style="color: #000000; "> {}<br /><br />    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #800000; ">'</span><span style="color: #800000; ">Dictionary length:</span><span style="color: #800000; ">'</span><span style="color: #000000; ">, len(d)<br /><br />@log<br /></span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> display():<br />    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> d<br /><br />@log<br /></span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> size():<br />    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #800000; ">'</span><span style="color: #800000; ">Dictionary length:</span><span style="color: #800000; ">'</span><span style="color: #000000; ">, len(d), </span><span style="color: #800000; ">'</span><span style="color: #800000; ">Size:</span><span style="color: #800000; ">'</span><span style="color: #000000; ">, d.</span><span style="color: #800080; ">__sizeof__</span><span style="color: #000000; ">()<br /><br /></span><span style="color: #0000FF; ">def</span><span style="color: #000000; "> main():<br />    </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> sys<br /><br />    </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">:<br />        </span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">:<br />            line </span><span style="color: #000000; ">=</span><span style="color: #000000; "> raw_input(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">%[ INPUT ] &gt;&gt;&gt; </span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br />        </span><span style="color: #0000FF; ">except</span><span style="color: #000000; "> (KeyboardInterrupt, IOError, EOFError):<br />            </span><span style="color: #0000FF; ">break</span><span style="color: #000000; "><br />        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> line.startswith(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">q</span><span style="color: #800000; ">'</span><span style="color: #000000; ">):<br />            </span><span style="color: #0000FF; ">break</span><span style="color: #000000; "><br /><br />        line </span><span style="color: #000000; ">=</span><span style="color: #000000; "> line.split()<br />        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> line[0].startswith(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">a</span><span style="color: #800000; ">'</span><span style="color: #000000; ">):<br />            obj </span><span style="color: #000000; ">=</span><span style="color: #000000; "> 0<br />            cnt </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; "><br />            l   </span><span style="color: #000000; ">=</span><span style="color: #000000; "> len(line)<br /><br />            </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> l </span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">:<br />                cnt </span><span style="color: #000000; ">=</span><span style="color: #000000; "> int(line[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">])<br />                </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> l </span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "> </span><span style="color: #000000; ">2</span><span style="color: #000000; ">:<br />                    obj </span><span style="color: #000000; ">=</span><span style="color: #000000; "> int(line[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">])<br />            add(cnt, obj)<br />        </span><span style="color: #0000FF; ">elif</span><span style="color: #000000; "> line[0].startswith(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">c</span><span style="color: #800000; ">'</span><span style="color: #000000; ">):<br />            clear()<br />        </span><span style="color: #0000FF; ">elif</span><span style="color: #000000; "> line[0].startswith(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">d</span><span style="color: #800000; ">'</span><span style="color: #000000; ">):<br />            display()<br />        </span><span style="color: #0000FF; ">elif</span><span style="color: #000000; "> line[0].startswith(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">m</span><span style="color: #800000; ">'</span><span style="color: #000000; ">):<br />            memory()<br />        </span><span style="color: #0000FF; ">elif</span><span style="color: #000000; "> line[0].startswith(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">s</span><span style="color: #800000; ">'</span><span style="color: #000000; ">):<br />            size()<br />        </span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">:<br />            err(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Unknown command. re-try please:</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br /><br /><br /></span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> </span><span style="color: #800080; ">__name__</span><span style="color: #000000; "> </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #800000; ">"</span><span style="color: #800000; ">__main__</span><span style="color: #800000; ">"</span><span style="color: #000000; ">:<br />    main()</span></div><br />Centos 5.5下运行python  memtest.py后，<br />输入add 1000 1，回车，<br />查看Mem占用。<br /><br />输入c回车，清除刚才创建的objects。<br />查看Mem占用。<br /><br />Python再也不把内存返还给内存了。<br /><br /><br /><br /><img src ="http://www.cnitblog.com/donne/aggbug/75671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/donne/" target="_blank">Don Li</a> 2011-09-28 16:32 <a href="http://www.cnitblog.com/donne/archive/2011/09/28/75671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP数据包分片机制详解</title><link>http://www.cnitblog.com/donne/archive/2010/12/23/72500.html</link><dc:creator>Don Li</dc:creator><author>Don Li</author><pubDate>Thu, 23 Dec 2010 09:21:00 GMT</pubDate><guid>http://www.cnitblog.com/donne/archive/2010/12/23/72500.html</guid><wfw:comment>http://www.cnitblog.com/donne/comments/72500.html</wfw:comment><comments>http://www.cnitblog.com/donne/archive/2010/12/23/72500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/donne/comments/commentRss/72500.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/donne/services/trackbacks/72500.html</trackback:ping><description><![CDATA[IP分片

在以太网上，由于电气限制，一帧不能超过1518字节，除去以太网帧头14字节（mac地址等）和帧尾4字节校验，还剩1500字节，这个大小称为MTU（最大传输单元）。

如果你的IP包大于1500字节，IP层就会分片了。

而1492的MTU值的来源，是因为PPPoE协议。PPP协议是宽带运营商用于对用户认证计费的（TCP/IP以太网无此功能）。PPPoE头尾一共8字节，所以有效载荷MTU变小了，原来有1500字节，现在只剩1492了。

这1492还包含20字节IP头，8字节UDP头或者20字节TCP头。所以真正的不分片数据，UDP为1492-28=1464，TCP为1492-40=1452字节。

TCP的确是流的，所以TCP一个包可以包含的数据大小为65536（包头长度定义为2字节）.a向b连续发送数据，b在每次接受到数据大小大于其低水位后，你的recv就会返回（假设是阻塞模式），并得到数据长度。当然你要持续接受和处理数据。

如果实际数据大于1452字节，IP会分片，但IP也会重组分片，所以还是一次recv就可以收到（不一定全，但跟分片无关）。

如果一个分片丢失，则整个TCP包都会重发，因为IP层不会将没收完的分片交给传输层。

ACK确认的时机，是收到了就会确认上一次的完整包的TCP序列号，如果不完整当然要等收完整，也不会交互到应用层，也不会发送ACK确认（可以通过3次确认上一个完整的序列号以让发送方快传）。

握手协商和ACK

TCP在发起3次握手时，会协商MSS（最大分节大小），这个值一般是路径最小MTU-IP头-TCP头，如果MTU是1500，则1500-20-20=1460字节。这样，每个包就不用IP层再分片了。所以你发2000字节，你调用一次send,如果发送缓冲区移动窗口够大，应该会全部成功。否则，会返回实际发送的字节。假设2000字节全部成功，tcp实际会将其分为1460和540两个包发送，接受端接受到1460这个包就会回一次ACK，接到540大小这个再ACK一次。每个分节都带有IP头和TCP头的。

IP分片只有第一个带有传输层头，其余的分片只有IP头。
<img src ="http://www.cnitblog.com/donne/aggbug/72500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/donne/" target="_blank">Don Li</a> 2010-12-23 17:21 <a href="http://www.cnitblog.com/donne/archive/2010/12/23/72500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>顺着兴致，再罗嗦两句吧</title><link>http://www.cnitblog.com/donne/archive/2010/05/19/66206.html</link><dc:creator>Don Li</dc:creator><author>Don Li</author><pubDate>Wed, 19 May 2010 03:39:00 GMT</pubDate><guid>http://www.cnitblog.com/donne/archive/2010/05/19/66206.html</guid><wfw:comment>http://www.cnitblog.com/donne/comments/66206.html</wfw:comment><comments>http://www.cnitblog.com/donne/archive/2010/05/19/66206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/donne/comments/commentRss/66206.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/donne/services/trackbacks/66206.html</trackback:ping><description><![CDATA[
		<font face="Arial" size="3">从开始荒废偶的博客算起，自从踏入Web game这一行，也算好几年的时间了。<br /><br />这期间，有做过自己喜欢的事情，用自己熟悉的技术，设计（本人仅负责服务端部分）和实现了几个不同结构的Web game服务端原型，比如基于Flash Socket，基于iPhone的在线实时MMO，或者纯粹HTTP类的Web game。<br /><br />不知为何，越熟悉，想法越乱。即使是在自己爱好的领域里探索，也总难免碰到这样，那样不受自己控制的，有反反复复的问题。<br /><br />也许是自己仍然不够熟悉这个领域，这个行业吧？<br /><br />但自己仍想坚持着自己朴素的愿望，希望能有这个一个理想的，不要太大的团队，组成一个合理的多边形，Design，</font>
		<font face="Arial" size="3">UI，</font>
		<font face="Arial" size="3">Art，Client，me（不好意思，不是因为谦虚才把自己排到最后的，但在项目原型阶段，这个多边形的重要性，个人认为，确实应该这样排），在大伙都集聚热情的情况下，合力做出一个好的产品，那该是多么美好的事情啊！<br /><br />理想总是跟现实相差太远。<br /><br />人力资源跟不上，项目管理混乱，责权不分，内部沟通困难，等等，等等，<br /><br />最讨厌纠缠于这些事情上。。。<br /><br />纠结ing...， 真希望能有人来挽救我， 上帝， 你在哪儿啊？</font>
		<br />
<img src ="http://www.cnitblog.com/donne/aggbug/66206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/donne/" target="_blank">Don Li</a> 2010-05-19 11:39 <a href="http://www.cnitblog.com/donne/archive/2010/05/19/66206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nginx + CodeIgniter PATH_INFO的config(N久没有写博了)</title><link>http://www.cnitblog.com/donne/archive/2010/05/19/66205.html</link><dc:creator>Don Li</dc:creator><author>Don Li</author><pubDate>Wed, 19 May 2010 03:21:00 GMT</pubDate><guid>http://www.cnitblog.com/donne/archive/2010/05/19/66205.html</guid><wfw:comment>http://www.cnitblog.com/donne/comments/66205.html</wfw:comment><comments>http://www.cnitblog.com/donne/archive/2010/05/19/66205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/donne/comments/commentRss/66205.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/donne/services/trackbacks/66205.html</trackback:ping><description><![CDATA[N久没来写博，越来越懒了，尽管还清楚的记得“总结就是进步”的真理，叹口气先。<br /><br />代码片段：<br /><br /><div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);"> 1</span> <span style="color: rgb(0, 0, 0);">location ~ /ci/.* {<br /></span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 0, 0);">    fastcgi_pass 127.0.0.1:9000;<br /></span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);">    include fastcgi_params;<br /></span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);">    fastcgi_param SCRIPT_FILENAME $document_root/ci/index.php;<br /></span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 0, 0);">    set $path_info = "";<br /></span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);">    if ($fastcgi_script_name ~ "^/ci/(.+)$") {<br /></span><span style="color: rgb(0, 128, 128);"> 7</span> <span style="color: rgb(0, 0, 0);">        set $path_info $1;<br /></span><span style="color: rgb(0, 128, 128);"> 8</span> <span style="color: rgb(0, 0, 0);">    }<br /></span><span style="color: rgb(0, 128, 128);"> 9</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">10</span> <span style="color: rgb(0, 0, 0);">    fastcgi_param PATH_INFO $path_info;<br /></span><span style="color: rgb(0, 128, 128);">11</span> <span style="color: rgb(0, 0, 0);">}</span></div><br />常见错误：<br />No input name： SCRIPT_FILENAME没有配好。<br />PATH_INFO配置不对： 可以在ci/index.php里打印出来$_SERVE['PATH_INFO']看看，错在什么地方。<br /><br />以上配置，已经支持这样的路径: http://&lt;host_url&gt;/ci/&lt;controller&gt;/&lt;method&gt;/&lt;parameter1&gt;...<br /><br />主要用于PATH_INFO类的CodeIgniter应用。<br /><br />蛮好使的。<br /><br /><br /><img src ="http://www.cnitblog.com/donne/aggbug/66205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/donne/" target="_blank">Don Li</a> 2010-05-19 11:21 <a href="http://www.cnitblog.com/donne/archive/2010/05/19/66205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS 2005中实现对Python 2.5.2的模块扩展实验</title><link>http://www.cnitblog.com/donne/archive/2008/12/04/52200.html</link><dc:creator>Don Li</dc:creator><author>Don Li</author><pubDate>Thu, 04 Dec 2008 08:13:00 GMT</pubDate><guid>http://www.cnitblog.com/donne/archive/2008/12/04/52200.html</guid><wfw:comment>http://www.cnitblog.com/donne/comments/52200.html</wfw:comment><comments>http://www.cnitblog.com/donne/archive/2008/12/04/52200.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/donne/comments/commentRss/52200.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/donne/services/trackbacks/52200.html</trackback:ping><description><![CDATA[以下为实验步骤：<br />一、VS 2005：<br />1. 新建Win32 Application, Application type: DLL, Additional options: Empty project.<br />2. Projects and Solutions-&gt;VC++ Directores中，新增&lt;Python&gt;\include目录到Include files和library files.<br />3. 新增Source Files:<br />hello.c:<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Python.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_98_300_Open_Image" onclick="this.style.display='none'; Codehighlighter1_98_300_Open_Text.style.display='none'; Codehighlighter1_98_300_Closed_Image.style.display='inline'; Codehighlighter1_98_300_Closed_Text.style.display='inline';" src="http://www.cnitblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_98_300_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_98_300_Closed_Text.style.display='none'; Codehighlighter1_98_300_Open_Image.style.display='inline'; Codehighlighter1_98_300_Open_Text.style.display='inline';" src="http://www.cnitblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> PyObject </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">message(PyObject </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">self, PyObject </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">args) </span><span id="Codehighlighter1_98_300_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnitblog.com/images/dot.gif" /></span><span id="Codehighlighter1_98_300_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">fromPython, result[</span><span style="COLOR: #000000">64</span><span style="COLOR: #000000">];<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.cnitblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">PyArg_Parse(args, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">(s)</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">fromPython))<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> NULL;<br /><img id="Codehighlighter1_199_298_Open_Image" onclick="this.style.display='none'; Codehighlighter1_199_298_Open_Text.style.display='none'; Codehighlighter1_199_298_Closed_Image.style.display='inline'; Codehighlighter1_199_298_Closed_Text.style.display='inline';" src="http://www.cnitblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_199_298_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_199_298_Closed_Text.style.display='none'; Codehighlighter1_199_298_Open_Image.style.display='inline'; Codehighlighter1_199_298_Open_Text.style.display='inline';" src="http://www.cnitblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_199_298_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnitblog.com/images/dot.gif" /></span><span id="Codehighlighter1_199_298_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        strcpy(result, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        strcat(result, fromPython);<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> Py_BuildValue(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, result);<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_347_391_Open_Image" onclick="this.style.display='none'; Codehighlighter1_347_391_Open_Text.style.display='none'; Codehighlighter1_347_391_Closed_Image.style.display='inline'; Codehighlighter1_347_391_Closed_Text.style.display='inline';" src="http://www.cnitblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_347_391_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_347_391_Closed_Text.style.display='none'; Codehighlighter1_347_391_Open_Image.style.display='inline'; Codehighlighter1_347_391_Open_Text.style.display='inline';" src="http://www.cnitblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> PyMethodDef hello_methods[] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_347_391_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnitblog.com/images/dot.gif" /></span><span id="Codehighlighter1_347_391_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_351_373_Open_Image" onclick="this.style.display='none'; Codehighlighter1_351_373_Open_Text.style.display='none'; Codehighlighter1_351_373_Closed_Image.style.display='inline'; Codehighlighter1_351_373_Closed_Text.style.display='inline';" src="http://www.cnitblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_351_373_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_351_373_Closed_Text.style.display='none'; Codehighlighter1_351_373_Open_Image.style.display='inline'; Codehighlighter1_351_373_Open_Text.style.display='inline';" src="http://www.cnitblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_351_373_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnitblog.com/images/dot.gif" /></span><span id="Codehighlighter1_351_373_Open_Text"><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">message</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, message, </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">,<br /><img id="Codehighlighter1_378_389_Open_Image" onclick="this.style.display='none'; Codehighlighter1_378_389_Open_Text.style.display='none'; Codehighlighter1_378_389_Closed_Image.style.display='inline'; Codehighlighter1_378_389_Closed_Text.style.display='inline';" src="http://www.cnitblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_378_389_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_378_389_Closed_Text.style.display='none'; Codehighlighter1_378_389_Open_Image.style.display='inline'; Codehighlighter1_378_389_Open_Text.style.display='inline';" src="http://www.cnitblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_378_389_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnitblog.com/images/dot.gif" /></span><span id="Codehighlighter1_378_389_Open_Text"><span style="COLOR: #000000">{NULL, NULL}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000">;<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_433_481_Open_Image" onclick="this.style.display='none'; Codehighlighter1_433_481_Open_Text.style.display='none'; Codehighlighter1_433_481_Closed_Image.style.display='inline'; Codehighlighter1_433_481_Closed_Text.style.display='inline';" src="http://www.cnitblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_433_481_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_433_481_Closed_Text.style.display='none'; Codehighlighter1_433_481_Open_Image.style.display='inline'; Codehighlighter1_433_481_Open_Text.style.display='inline';" src="http://www.cnitblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />_declspec(dllexport) </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> inithello() </span><span id="Codehighlighter1_433_481_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnitblog.com/images/dot.gif" /></span><span id="Codehighlighter1_433_481_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    (</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)Py_InitModule(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, hello_methods);<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />4. 以Release方式Build。<br />5. 修改扩展名.dll为pyd.<br /><br />二、Python：<br />1. copy刚才生成的hello.pyd到项目目录下，或者可以import的lib目录。<br />2. 新建main.py:<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> hello<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000"> hello.message(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">hhahhah</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">)</span></div><br />搞定。<br /><img src ="http://www.cnitblog.com/donne/aggbug/52200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/donne/" target="_blank">Don Li</a> 2008-12-04 16:13 <a href="http://www.cnitblog.com/donne/archive/2008/12/04/52200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python项目的文档化开发</title><link>http://www.cnitblog.com/donne/archive/2008/09/26/49546.html</link><dc:creator>Don Li</dc:creator><author>Don Li</author><pubDate>Fri, 26 Sep 2008 03:19:00 GMT</pubDate><guid>http://www.cnitblog.com/donne/archive/2008/09/26/49546.html</guid><wfw:comment>http://www.cnitblog.com/donne/comments/49546.html</wfw:comment><comments>http://www.cnitblog.com/donne/archive/2008/09/26/49546.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/donne/comments/commentRss/49546.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/donne/services/trackbacks/49546.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">在语言要求的地方注释，以标准的注释语法。<br>注释说明必要的信息，<br>适当的设计思路描述<br>适当的算法设计描述</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"><br>文档化的工具： <br>&nbsp;&nbsp;&nbsp; 1. epydoc:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 纯Python实现。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与Python的结合非常自然，稳定，可扩展。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 2. DoxyGen.<br>&nbsp;&nbsp;&nbsp; <br>epydoc标签规范：<br>&nbsp;&nbsp;&nbsp; 1. py文献信息：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @author:&nbsp;&nbsp; ...作者<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @license:&nbsp; ...版权<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @contact:&nbsp; ...联系<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 2. py状态信息：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @version:&nbsp; ...版本推荐使用$Id$<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @todo[ver]:...改进，可以指定针对的版本<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 3. py模块信息：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @var v: ...模块变量v说明<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @type v: ...模块变量类型v说明<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 4. py函数信息：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @param p: ...参数p说明<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @type p: ...参数p类型说明<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @return: ...返回值说明<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @rtype: ...返回值类型说明<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 5. py提醒信息：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @note: ...注解<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @attention: ...注意<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @bug: ... 问题<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @warning: ...警告<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 6. py关联信息：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @see: ...参考资料<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 7. py注释风格：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">#</span><span style="COLOR: #008000">xxxx.py文件模板</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #008000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800000">'''</span><span style="COLOR: #800000"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #800000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>@version:&nbsp;$Id$<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #800000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>@author:&nbsp;U{username&lt;mailto:&nbsp;email_address&gt;}<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #800000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>@see:&nbsp;资料<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #800000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800000">'''</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;sys,&nbsp;os,&nbsp;other<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Templates(object):<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">'''</span><span style="COLOR: #800000"><br></span><span style="COLOR: #008080">12</span><span style="COLOR: #800000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;类说明<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #800000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">'''</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">__init__</span><span style="COLOR: #000000">(self,&nbsp;param1):<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">'''</span><span style="COLOR: #800000"><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #800000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@param&nbsp;param1:&nbsp;注释内容。<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #800000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@type&nbsp;param1:&nbsp;介绍。<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #800000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@return:&nbsp;返回简介。<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #800000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@rtype&nbsp;v：&nbsp;返回类型简介。<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #800000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">'''</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.param1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;param1</span></div>
<br><span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;8. 特殊标签：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; U{text&lt;url&gt;}： URL<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; L{text&lt;object&gt;}：交叉引用，自动生成到其他对象的文档页面链接。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; object为对象名称， 类/函数/变量名</span>
<img src ="http://www.cnitblog.com/donne/aggbug/49546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/donne/" target="_blank">Don Li</a> 2008-09-26 11:19 <a href="http://www.cnitblog.com/donne/archive/2008/09/26/49546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最大公约数算法</title><link>http://www.cnitblog.com/donne/archive/2008/07/23/47050.html</link><dc:creator>Don Li</dc:creator><author>Don Li</author><pubDate>Wed, 23 Jul 2008 08:29:00 GMT</pubDate><guid>http://www.cnitblog.com/donne/archive/2008/07/23/47050.html</guid><wfw:comment>http://www.cnitblog.com/donne/comments/47050.html</wfw:comment><comments>http://www.cnitblog.com/donne/archive/2008/07/23/47050.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/donne/comments/commentRss/47050.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/donne/services/trackbacks/47050.html</trackback:ping><description><![CDATA[1. 欧几里德算法和扩展欧几里德算法<br>1). 欧几里德算法<br>欧几里德算法又称辗转相除法， 用于计算两个整数a, b的最大公约数。其计算原理依赖于下面的定理：<br>定理： gcd(a, b) = gcd(b, a mod b)<br><br>证明：<br>&nbsp; a可以表示成a = kb + r, 则r = a mod b<br>&nbsp; 假设d是a, b的一个公约数， 则有&nbsp; d|a, d|b, 而r = a - kb, 因此d|r。<br>&nbsp; 因此，d是(b, a mod b)的公约数。<br>&nbsp; 加上d是(b，a mod b)的公约数，则d|b, d|r, 但是a = kb + r,因此d也是(a, b)的公约数。<br>&nbsp; 因此，(a, b) 和(a, a mod b)的公约数是一样的，其最大公约数也必然相等，得证。<br><br>欧几里德的Python语言描述为：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;gcd(a,&nbsp;b):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;b:<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;a,&nbsp;b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b,&nbsp;a<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;b&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;0:<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;b<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;temp<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;a</span></div>
<br>2. Stein算法<br>欧几里德算法是计算两个数最大公约数的传统算法，无论是理论，还是从效率上都是很好的。但是他有一个致命的缺陷，这个缺陷只有在很大的素数时才会显现出来。<br>考虑现在的硬件平台，一般整数最多也就是64位， 对于这样的整数，计算两个数值就的模很简单的。对于字长为32位的平台，计算两个不超过32位的整数的模，只需要一个指令周期，而计算64位以下的整数模，也不过几个周期而已。但是对于更大的素数，这样的计算过程就不得不由用户来设计，为了计算两个超过64位的整数的模，用户也许不得不采用类似于多位除法手算过程中的试商法，这个过程不但复杂，而且消耗了很多CPU时间。对于现代密码算法，要求计算128位以上的素数的情况比比皆是，设计这样的程序迫切希望能够抛弃除法和取模。<br>Stein算法由J.Stein 1961年提出，这个方法也是计算两个数的最大公约数。和欧几里德算法不同的是，Stein算法只有整数的移位和加减法，这对于程序设计者是一个福音。<br>为了说明Stein算法的正确性，首先必须注意到以下结论：<br>&nbsp; gcd(a, a) = a， 也就是一个数和他自己的公约数是其自身。<br>&nbsp; gcd(ka, kb) = k * gcd(a, b)，也就是最大公约数运算和倍乘运算可以交换，特殊的，当k=2时，说明两个偶数的最大公约数比如能被2整除。<br>Stein算法的python实现如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;gcd_Stein(a,&nbsp;b):&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;b:<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a,&nbsp;b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b,&nbsp;a<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(0&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;b):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;a<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;0&nbsp;</span><span style="COLOR: #0000ff">and</span><span style="COLOR: #000000">&nbsp;b&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;0:<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;gcd_Stein(a</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;b</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;0:<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;gcd_Stein(a&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;b)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;b&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;0:<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;gcd_Stein(a,&nbsp;b&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;gcd_Stein((a&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;b)&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;(a&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;b)&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)&nbsp;</span></div>
<br><br><br>
<img src ="http://www.cnitblog.com/donne/aggbug/47050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/donne/" target="_blank">Don Li</a> 2008-07-23 16:29 <a href="http://www.cnitblog.com/donne/archive/2008/07/23/47050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下文件权限参数的解释</title><link>http://www.cnitblog.com/donne/archive/2008/05/30/44618.html</link><dc:creator>Don Li</dc:creator><author>Don Li</author><pubDate>Fri, 30 May 2008 09:31:00 GMT</pubDate><guid>http://www.cnitblog.com/donne/archive/2008/05/30/44618.html</guid><wfw:comment>http://www.cnitblog.com/donne/comments/44618.html</wfw:comment><comments>http://www.cnitblog.com/donne/archive/2008/05/30/44618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/donne/comments/commentRss/44618.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/donne/services/trackbacks/44618.html</trackback:ping><description><![CDATA[【权限】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【所有者】&nbsp;&nbsp;&nbsp; 【所有组】<br>&nbsp;&nbsp; drwxr-xr-x&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp; test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4096&nbsp; 6月&nbsp; 6 17:17 jsp-update<br>&nbsp;<br>&nbsp;<br>&nbsp; 我们现在就来看看关于权限和所有者的解释：<br>&nbsp; <br>&nbsp; 一、【权限】<br>&nbsp;&nbsp;&nbsp; 这个参数共10位：<br>&nbsp;&nbsp;&nbsp; 1. 首字母的意义如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d ： 目录<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c ： 字符设备文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b ： 块设备文件 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p ： FIFO<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s ： 套接字<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l ： 符号链接<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - ： 文件 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 试验一下，可以看到，被加粗的两种首字母是最常见的两种情况。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由此可以推出，上面例子中，jsp-update就是一个目录， 而roboo_display_traker.log肯定是一个文件。<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 2. 三元组字符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【权限】参数中，除却首字母，剩下的9个字符，每三个，算一个三元组。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从左到右，第一个三元组代表所有者的权限，第二个三元组代表所有组的权限，第三个三元组代表其他用户的权限。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中，'r'代表可读，'w'代表可写，'x'代表可以执行，'-'代表没有相应权限。<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看上面的例子1，我们得出：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jsp-update 这个文件夹， 所有者是test，所有组为test，test可读写执行，test组的其他用户可以读执行，其他用户可以读执行。<br>&nbsp;<br>&nbsp;<br>那么，谁有权修改一个文件，或文件夹的【权限】， 以及如何修改呢？<br>1. 可以修改一个文件权限的人： 文件所有者，或者比文件所有者等级高的用户。<br>2. 如何修改：<br>&nbsp;&nbsp; 两种方式：<br>&nbsp;&nbsp;&nbsp;&nbsp; 1. 字符模式：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子： <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod +x roboo_display_traker.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #赋予所有人执行的权限<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod -x roboo_display_traker.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #取消所有人执行的权限<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod u+w roboo_display_traker.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #赋予所有者写的权限<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod g+w roboo_display_traker.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #赋予所有组写的权限<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod o+w roboo_display_traker.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #赋予所有组写的权限<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解释： +代表赋予，-代表取消，u代表所有者，g代表所有组，o代表其他用户。<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; 2. 数字模式：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数字和三元组（上面提到的）对应关系如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rwx&nbsp;&nbsp;&nbsp; 7<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rw-&nbsp;&nbsp;&nbsp; 6<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r-x&nbsp;&nbsp;&nbsp; 5<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r--&nbsp;&nbsp;&nbsp; 4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -wx&nbsp;&nbsp;&nbsp; 3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -w-&nbsp;&nbsp;&nbsp; 2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --x&nbsp;&nbsp;&nbsp; 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---&nbsp;&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod 111 roboo_display_traker.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #赋予所有人只能执行的权限<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod 777 roboo_display_traker.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #赋予所有人所有的权限<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chmod 755 roboo_display_traker.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #赋予所有者所有权限，所有组，其他用户读和执行的权限。<br>
<img src ="http://www.cnitblog.com/donne/aggbug/44618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/donne/" target="_blank">Don Li</a> 2008-05-30 17:31 <a href="http://www.cnitblog.com/donne/archive/2008/05/30/44618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用来做搜索日志负载测试的一段脚本</title><link>http://www.cnitblog.com/donne/archive/2008/05/16/43811.html</link><dc:creator>Don Li</dc:creator><author>Don Li</author><pubDate>Fri, 16 May 2008 08:47:00 GMT</pubDate><guid>http://www.cnitblog.com/donne/archive/2008/05/16/43811.html</guid><wfw:comment>http://www.cnitblog.com/donne/comments/43811.html</wfw:comment><comments>http://www.cnitblog.com/donne/archive/2008/05/16/43811.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/donne/comments/commentRss/43811.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/donne/services/trackbacks/43811.html</trackback:ping><description><![CDATA[共三个文件：<br><br>1. settings.py:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">#</span><span style="COLOR: #008000">-*-&nbsp;coding:&nbsp;utf-8&nbsp;-*-</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>SETTINGS&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">SITE</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">http://xx.xxxx.com</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">USERS_COUNT</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">TIMES_PER_USER</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">channels</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:[</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">ring</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">video</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">image</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">game</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">theme</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">sms</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">soft</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">read</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,],<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br><br>2.VUser.py:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">#</span><span style="COLOR: #008000">-*-&nbsp;coding:&nbsp;utf-8&nbsp;-*-</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;urllib2,&nbsp;logging,&nbsp;re<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800080">__author__</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000"><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#111;&#110;&#110;&#101;&#46;&#99;&#110;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">donne.cn@gmail.com</a></span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800080">__version__</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0.1.0</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800080">__copyright__</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Copyright&nbsp;(c)&nbsp;2008&nbsp;donne.cn</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800080">__license__</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">donne.cn</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800080">__doc__</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">'''</span><span style="COLOR: #800000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;模拟用户访问目标站点，可以模拟主页访问，搜索，详情，下载一连串行为<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800000">'''</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>logging.basicConfig(level</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">logging.DEBUG,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;format</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">%(asctime)s&nbsp;%(levelname)s&nbsp;%(message)s</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">filename='./FluxStatLoadTest.log',</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filemode</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">w</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;VUser(object):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">__init__</span><span style="COLOR: #000000">(self,&nbsp;url,&nbsp;channel&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;None):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._channels&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">ring</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Sring.wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Search.wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">video</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Svideo.wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">image</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Simage.wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">game</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Sgame.wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">theme</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Stheme.wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">sms</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Sms.wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">soft</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Ssoft.wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">read</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Sread.wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._url&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;url<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._channel&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Sring.wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;channel:<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._channel&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;self._channels[channel]<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">''</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;getDetailUrl(self,&nbsp;content):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_url&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;re.compile(</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">&lt;br/&gt;&lt;a&nbsp;href="(.*?)"&gt;1.</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">).\<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;search(content,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">).group(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">).split(</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)[</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;self.urlFormat(_url)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;getDownloadUrl(self,&nbsp;content):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;self._channel&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;[</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Search.wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Sms.wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Sread.wml</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,]:<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">''</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_url&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;re.compile(</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">/&gt;&lt;a&nbsp;href="(.*?)"&gt;&#x514D;&#x8D39;&#x4E0B;&#x8F7D;</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">).\<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;search(content).group(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;self.urlFormat(self._url&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">/</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;_url)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;getSearchUrl(self):&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;self._getSessionId(self.getPage(self._url))<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;self.urlFormat(self._url&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">/</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;self._channel&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">;jsessionid=</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;self.id&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">?q=mm</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;_getSessionId(self,&nbsp;content):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;re.compile(</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">;jsessionid=(.*?)"&gt;&lt;</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">).\<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;search(content).group(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;urlFormat(self,&nbsp;url):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;str(url).replace(</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">&amp;amp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">&amp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">).replace(</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">./</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,&nbsp;self._url&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">/</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;getPage(self,&nbsp;url):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;url:<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;urllib2.Request(url)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.add_header(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">User-Agent</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Roboo-QA-FluxLoadTester&nbsp;0.1.0&nbsp;by&nbsp;Don.Li</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;urllib2.urlopen(req).read()<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;search(self,&nbsp;url):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;self.getDetailUrl(self.getPage(url))<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">__name__</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">__main__</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;user&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;VUser('</span><span style="COLOR: #800000"></span><span style="COLOR: #800000"><a href="http://xxx.xxxx.com'/">http://xxx.xxxx.com'</a></span><span style="COLOR: #800000"></span><span style="COLOR: #000000">,&nbsp;channel</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">theme</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;logging.info(user.id)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;user.getSearchUrl()<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;user.getDetailUrl(user.getPage(url))<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;logging.info(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Detail&nbsp;URL:&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;url)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;user.getDownloadUrl(user.getPage(url))<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;logging.info(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Download&nbsp;URL:&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;url)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;user.getPage(url)</span></div>
<br>3. scenices.py:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">#</span><span style="COLOR: #008000">-*-&nbsp;coding:&nbsp;utf-8&nbsp;-*-</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;logging,&nbsp;threading<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;time&nbsp;</span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;sleep<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;VUser&nbsp;</span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;VUser<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;settings&nbsp;</span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;SETTINGS<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800080">__author__</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"donne.cn@gmail.com</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800080">__version__</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0.1.0</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800080">__copyright__</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Copyright&nbsp;(c)&nbsp;2008&nbsp;donne.cn</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800080">__license__</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">donne.cn</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800080">__doc__</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">'''</span><span style="COLOR: #800000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据参数控制虚拟用户的行为<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800000">'''</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>logging.basicConfig(level</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">logging.DEBUG,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;format</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">%(asctime)s&nbsp;%(levelname)s&nbsp;%(message)s</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">filename='./FluxStatLoadTest.log',</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filemode</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">w</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;threadUser(threading.Thread):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">__init__</span><span style="COLOR: #000000">(self,&nbsp;name,&nbsp;channel&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;None):&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._user&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;VUser(SETTINGS[</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">SITE</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">],&nbsp;channel)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.vp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;0<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threading.Thread.</span><span style="COLOR: #800080">__init__</span><span style="COLOR: #000000">(self,&nbsp;name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;name)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;run(self):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;range(SETTINGS[</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">TIMES_PER_USER</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">]):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_url&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;self._user.getSearchUrl()<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_url&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;self._user.getDetailUrl(self._user.getPage(_url))<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logging.info(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Detail&nbsp;URL:&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;_url)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_url&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;self._user.getDownloadUrl(self._user.getPage(_url))<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logging.info(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Download&nbsp;URL:&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;_url)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._user.getPage(_url)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.vp&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logging.info(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">The&nbsp;User&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;self._name&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">&nbsp;VP&nbsp;is:&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;str(self.vp)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">&nbsp;Now.</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">__name__</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">__main__</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">:<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;users&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;[]<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;range(</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;channel&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;SETTINGS[</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">channels</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">][i]<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;range(SETTINGS[</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">USERS_COUNT</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">]):<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;threadUser(channel&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">&nbsp;Thread&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;str(j&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">),&nbsp;channel&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;channel)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;users.append(user)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;user&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;users:<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.start()<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;user&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;users:<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.join()</span></div>
<br><br>修改settings.py里的参数，运行scenices.py, 可以实现指定类型的指定数目的虚拟用户，并发访问目标网站，生成可以预估的log文件，对网站log生成功能实现负载测试，以期发现其中缺陷。
<img src ="http://www.cnitblog.com/donne/aggbug/43811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/donne/" target="_blank">Don Li</a> 2008-05-16 16:47 <a href="http://www.cnitblog.com/donne/archive/2008/05/16/43811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>