﻿<?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>C++博客-开源之路</title><link>http://www.cppblog.com/riverbird/</link><description>忆往昔,
项羽不过江.
江东好风光!
今振臂一呼,率甲三千,
试问天!
</description><language>zh-cn</language><lastBuildDate>Fri, 09 Jan 2009 07:02:59 GMT</lastBuildDate><pubDate>Fri, 09 Jan 2009 07:02:59 GMT</pubDate><ttl>60</ttl><item><title>python模块之threading: 在python中使用多线程</title><link>http://www.cppblog.com/riverbird/archive/2007/12/26/39704.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Wed, 26 Dec 2007 10:04:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/26/39704.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39704.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/26/39704.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39704.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39704.html</trackback:ping><description><![CDATA[python是支持多线程的，并且是native的线程。主要是通过thread和threading这两个模块来实现的。thread是比较底层的模
块，threading是对thread做了一些包装的，可以更加方便的被使用。这里需要提一下的是python对线程的支持还不够完善，不能利用多
CPU，但是下个版本的python中已经考虑改进这点，让我们拭目以待吧。<br>&nbsp;&nbsp;&nbsp;
threading模块里面主要是对一些线程的操作对象化了，创建了叫Thread的class。一般来说，使用线程有两种模式，一种是创建线程要执行的
函数，把这个函数传递进Thread对象里，让它来执行；另一种是直接从Thread继承，创建一个新的class，把线程执行的代码放到这个新的
class里。我们来看看这两种做法吧。<br><br>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><span style="color: #008000;">#</span><span style="color: #008000;">-*-&nbsp;encoding:&nbsp;gb2312&nbsp;-*-</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;string,&nbsp;threading,&nbsp;time<br><br></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;thread_main(a):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">global</span><span style="color: #000000;">&nbsp;count,&nbsp;mutex<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;获得线程名</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;threadname&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;threading.currentThread().getName()<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;xrange(0,&nbsp;int(a)):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;取得锁</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mutex.acquire()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;count&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;释放锁</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mutex.release()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;threadname,&nbsp;x,&nbsp;count<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time.sleep(</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;main(num):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">global</span><span style="color: #000000;">&nbsp;count,&nbsp;mutex<br>&nbsp;&nbsp;&nbsp;&nbsp;threads&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[]<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;创建一个锁</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;mutex&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;threading.Lock()<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;先创建线程对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;xrange(0,&nbsp;num):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threads.append(threading.Thread(target</span><span style="color: #000000;">=</span><span style="color: #000000;">thread_main,&nbsp;args</span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #000000;">10</span><span style="color: #000000;">,)))<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;启动所有线程</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;t&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;threads:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.start()<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;主线程中等待所有子线程退出</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;t&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;threads:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.join()&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br></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>&nbsp;&nbsp;&nbsp;&nbsp;num&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;创建4个线程</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;main(</span><span style="color: #000000;">4</span><span style="color: #000000;">)</span></div>
</div>
<br>上面的就是第一种做法，这种做法是很常见的，下面是另一种，曾经使用过Java的朋友应该很熟悉这种模式：<br><br>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><span style="color: #008000;">#</span><span style="color: #008000;">-*-&nbsp;encoding:&nbsp;gb2312&nbsp;-*-</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;threading<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;time<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Test(threading.Thread):<br>&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;num):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threading.Thread.</span><span style="color: #800080;">__init__</span><span style="color: #000000;">(self)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._run_num&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;num<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;run(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">global</span><span style="color: #000000;">&nbsp;count,&nbsp;mutex<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadname&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;threading.currentThread().getName()<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;xrange(0,&nbsp;int(self._run_num)):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mutex.acquire()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;count&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mutex.release()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;threadname,&nbsp;x,&nbsp;count<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time.sleep(</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br><br></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>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">global</span><span style="color: #000000;">&nbsp;count,&nbsp;mutex<br>&nbsp;&nbsp;&nbsp;&nbsp;threads&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[]<br>&nbsp;&nbsp;&nbsp;&nbsp;num&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;创建锁</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;mutex&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;threading.Lock()<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;创建线程对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;xrange(0,&nbsp;num):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threads.append(Test(</span><span style="color: #000000;">10</span><span style="color: #000000;">))<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;启动线程</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;t&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;threads:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.start()<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;等待子线程结束</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;t&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;threads:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.join()&nbsp; <br></span></div>
</div><img src ="http://www.cppblog.com/riverbird/aggbug/39704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-26 18:04 <a href="http://www.cppblog.com/riverbird/archive/2007/12/26/39704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Groovy-An agile dynamic language for the Java Platform</title><link>http://www.cppblog.com/riverbird/archive/2007/12/26/39700.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Wed, 26 Dec 2007 09:54:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/26/39700.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39700.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/26/39700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39700.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39700.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/riverbird/archive/2007/12/26/39700.html'>阅读全文</a><img src ="http://www.cppblog.com/riverbird/aggbug/39700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-26 17:54 <a href="http://www.cppblog.com/riverbird/archive/2007/12/26/39700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三百个好用又免费的软件名单</title><link>http://www.cppblog.com/riverbird/archive/2007/12/26/39697.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Wed, 26 Dec 2007 09:35:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/26/39697.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39697.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/26/39697.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39697.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39697.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/riverbird/archive/2007/12/26/39697.html'>阅读全文</a><img src ="http://www.cppblog.com/riverbird/aggbug/39697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-26 17:35 <a href="http://www.cppblog.com/riverbird/archive/2007/12/26/39697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在VC中如何结束进程和启动新进程？</title><link>http://www.cppblog.com/riverbird/archive/2007/12/26/39696.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Wed, 26 Dec 2007 09:34:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/26/39696.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39696.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/26/39696.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39696.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39696.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/riverbird/archive/2007/12/26/39696.html'>阅读全文</a><img src ="http://www.cppblog.com/riverbird/aggbug/39696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-26 17:34 <a href="http://www.cppblog.com/riverbird/archive/2007/12/26/39696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IronPython学习 之hello word.</title><link>http://www.cppblog.com/riverbird/archive/2007/12/26/39646.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Wed, 26 Dec 2007 01:17:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/26/39646.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39646.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/26/39646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39646.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39646.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/riverbird/archive/2007/12/26/39646.html'>阅读全文</a><img src ="http://www.cppblog.com/riverbird/aggbug/39646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-26 09:17 <a href="http://www.cppblog.com/riverbird/archive/2007/12/26/39646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python 脚本作为Windows服务启动</title><link>http://www.cppblog.com/riverbird/archive/2007/12/25/39582.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Tue, 25 Dec 2007 07:12:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/25/39582.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39582.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/25/39582.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39582.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39582.html</trackback:ping><description><![CDATA[如果我们想让系统启动的时候就执行某个程序，windows系统和unix系统是不一样的，对于unix只需要将要执行的命令放到
rc.local中，系统重新启动的时候就可以加载了。windows就麻烦多了，如果你将程序放到启动组中，只有输入了密码后，程序才被执行，如果想在
系统一启动的时候就执行程序，必须使用nt服务。
<br>python下如何使用nt服务，其实很简单。
<br>下载python的win32支持。我使用的是：pywin32-202.win32-py2.3.exe安装好后就可以来写我们的服务了。
<br>我们先来建立一个空的服务，建立test1.py这个文件，并写入如下代码:
<br>
<br>#&nbsp;-*-&nbsp;coding:&nbsp;cp936&nbsp;-*-
<br>import&nbsp;win32serviceutil
<br>import&nbsp;win32service
<br>import&nbsp;win32event
<br>
<br>class&nbsp;test1(win32serviceutil.ServiceFramework):
<br>&nbsp;&nbsp;&nbsp;&nbsp;_svc_name_&nbsp;=&nbsp;"test_python"
<br>&nbsp;&nbsp;&nbsp;&nbsp;_svc_display_name_&nbsp;=&nbsp;"test_python"
<br>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self,&nbsp;args):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;win32serviceutil.ServiceFramework.__init__(self,&nbsp;args)
<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.hWaitStop&nbsp;=&nbsp;win32event.CreateEvent(None,&nbsp;0,&nbsp;0,&nbsp;None)
<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;SvcStop(self):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;先告诉SCM停止这个过程
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;设置事件
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;win32event.SetEvent(self.hWaitStop)
<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;SvcDoRun(self):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;等待服务被停止
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;win32event.WaitForSingleObject(self.hWaitStop,&nbsp;win32event.INFINITE)
<br>
<br>if&nbsp;__name__=='__main__':
<br>&nbsp;&nbsp;&nbsp;&nbsp;win32serviceutil.HandleCommandLine(test1)<br>
<br>这里注意，如果你需要更改文件名，比如将win32serviceutil.HandleCommandLine(test1)中的test1更改为你的文件名，同时class也需要和你的文件名一致，否则会出现服务不能启动的问题。
<br>在命令窗口执行，test1.py可以看到帮助提示
<br>
<br>C:\&gt;test1.py
<br>Usage:&nbsp;'test1.py&nbsp;[options]&nbsp;install|update|remove|start&nbsp;[...]|stop|restart&nbsp;[...]|
<br>debug&nbsp;[...]'
<br>Options&nbsp;for&nbsp;'install'&nbsp;and&nbsp;'update'&nbsp;commands&nbsp;only:
<br>&nbsp;--username&nbsp;domain\username&nbsp;:&nbsp;The&nbsp;Username&nbsp;the&nbsp;service&nbsp;is&nbsp;to&nbsp;run&nbsp;under
<br>&nbsp;--password&nbsp;password&nbsp;:&nbsp;The&nbsp;password&nbsp;for&nbsp;the&nbsp;username
<br>&nbsp;--startup&nbsp;[manual|auto|disabled]&nbsp;:&nbsp;How&nbsp;the&nbsp;service&nbsp;starts,&nbsp;default&nbsp;=&nbsp;manual
<br>&nbsp;--interactive&nbsp;:&nbsp;Allow&nbsp;the&nbsp;service&nbsp;to&nbsp;interact&nbsp;with&nbsp;the&nbsp;desktop.
<br>
<br>C:\&gt;<br>
<br>安装我们的服务
<br>
<br>[code:1:05b7353f1c]C:\&gt;test1.py&nbsp;install
<br>Installing&nbsp;service&nbsp;test_python&nbsp;to&nbsp;Python&nbsp;class&nbsp;C:\test1.test1
<br>Service&nbsp;installed
<br>
<br>C:\&gt;<br>
<br>我们就可以用命令或者在控制面板-》管理工具-》服务中管理我们的服务了。在服务里面可以看到test_python这个服务，虽然这个服务什么都不做，但能启动和停止他。<img src ="http://www.cppblog.com/riverbird/aggbug/39582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-25 15:12 <a href="http://www.cppblog.com/riverbird/archive/2007/12/25/39582.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何做到只允许一个实例运行？</title><link>http://www.cppblog.com/riverbird/archive/2007/12/25/39581.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Tue, 25 Dec 2007 07:06:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/25/39581.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39581.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/25/39581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39581.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39581.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/riverbird/archive/2007/12/25/39581.html'>阅读全文</a><img src ="http://www.cppblog.com/riverbird/aggbug/39581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-25 15:06 <a href="http://www.cppblog.com/riverbird/archive/2007/12/25/39581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.Net脚本语言Boo简介</title><link>http://www.cppblog.com/riverbird/archive/2007/12/25/39576.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Tue, 25 Dec 2007 05:57:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/25/39576.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39576.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/25/39576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39576.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39576.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/riverbird/archive/2007/12/25/39576.html'>阅读全文</a><img src ="http://www.cppblog.com/riverbird/aggbug/39576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-25 13:57 <a href="http://www.cppblog.com/riverbird/archive/2007/12/25/39576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python 3.0a2 Release</title><link>http://www.cppblog.com/riverbird/archive/2007/12/24/39514.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Mon, 24 Dec 2007 08:55:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/24/39514.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39514.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/24/39514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39514.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39514.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/riverbird/archive/2007/12/24/39514.html'>阅读全文</a><img src ="http://www.cppblog.com/riverbird/aggbug/39514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-24 16:55 <a href="http://www.cppblog.com/riverbird/archive/2007/12/24/39514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Open Testware Reviews</title><link>http://www.cppblog.com/riverbird/archive/2007/12/24/39506.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Mon, 24 Dec 2007 06:58:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/24/39506.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39506.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/24/39506.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39506.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39506.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/riverbird/archive/2007/12/24/39506.html'>阅读全文</a><img src ="http://www.cppblog.com/riverbird/aggbug/39506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-24 14:58 <a href="http://www.cppblog.com/riverbird/archive/2007/12/24/39506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在python代码中进行自动化测试</title><link>http://www.cppblog.com/riverbird/archive/2007/12/24/39481.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Mon, 24 Dec 2007 02:44:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/24/39481.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39481.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/24/39481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39481.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39481.html</trackback:ping><description><![CDATA[<div class="post-content">
<p>python有一个叫doctest的模块，很有意思，它可以让你在代码的注释中写入一些特殊的注释，<br>
这些注释是测试程序。python可以自动对它进行测试。<br>
import doctest</p>
<p>def myadd(a, b):<br>
&#8221;&#8217;<br>
&gt;&gt;&gt; myadd(1, 2)<br>
3<br>
&gt;&gt;&gt; myadd(4, 5)<br>
9<br>
&#8221;&#8217;<br>
return a+b</p>
<p>if __name__ == &#8216;__main__&#8217;:<br>
doctest.testmod()</p>
<p>输出：</p>
<p>D:\&gt;e2.py -v<br>
Trying:<br>
myadd(1, 2)<br>
Expecting:<br>
3<br>
ok<br>
Trying:<br>
myadd(4, 5)<br>
Expecting:<br>
9<br>
ok<br>
1 items had no tests:<br>
__main__<br>
1 items passed all tests:<br>
2 tests in __main__.myadd<br>
2 tests in 2 items.<br>
2 passed and 0 failed.<br>
Test passed.</p>
<p>注意运行的时候后面加上　-v 的参数，在linux下运行的话，最好这样　python 程序.py -v</p>
</div><img src ="http://www.cppblog.com/riverbird/aggbug/39481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-24 10:44 <a href="http://www.cppblog.com/riverbird/archive/2007/12/24/39481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>发现一个用于windows下GUI自动化测试的东东</title><link>http://www.cppblog.com/riverbird/archive/2007/12/24/39480.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Mon, 24 Dec 2007 02:43:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/24/39480.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39480.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/24/39480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39480.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39480.html</trackback:ping><description><![CDATA[<div class="post-content">
<p>pywinauto is a set of python modules
to automate the Microsoft Windows GUI. At it&#8217;s simplest it allows you
to send mouse and keyboard actions to windows dialogs and controls.</p>
<p>pywinauto是一些用于自动化测试微软Windows图形界面的模块的集合。它可以允许你很容易的发送鼠标、键盘动作给Windows的对话框和控件。</p>
<p>地址：<a  href="http://www.openqa.org/pywinauto/"><strong><font color="#006699">http://www.openqa.org/pywinauto/</font></strong></a></p>
</div><img src ="http://www.cppblog.com/riverbird/aggbug/39480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-24 10:43 <a href="http://www.cppblog.com/riverbird/archive/2007/12/24/39480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cherrypy</title><link>http://www.cppblog.com/riverbird/archive/2007/12/24/39479.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Mon, 24 Dec 2007 02:39:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/12/24/39479.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/39479.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/12/24/39479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/39479.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/39479.html</trackback:ping><description><![CDATA[<p>
<span class="searchword0">CherryPy</span> is a pythonic, object-oriented HTTP framework.
</p>
<p>
<span class="searchword0">CherryPy</span> allows developers to build
web applications in much the same way they would build any other
object-oriented Python program. This usually results in smaller source
code developed in less time.
</p>
<p>
<span class="searchword0">CherryPy</span> is now more than three years
old and it is has proven very fast and stable. It is being used in
production by many sites, from the simplest ones to the most demanding
ones.
</p>
<p>
Oh, and most importantly: <span class="searchword0">CherryPy</span> is <strong>fun</strong> to work with :-) Here's how easy it is to write "Hello World" in <a  href="http://www.cherrypy.org/wiki/CherryPy" class="wiki"><span class="searchword0">CherryPy</span></a> 3:
</p>
<div class="code">
<pre><span class="p_word">import</span> <span class="p_identifier"><span class="searchword0">cherrypy</span></span><br><br><span class="p_word">class</span> <span class="p_classname">HelloWorld</span><span class="p_operator">(</span><span class="p_identifier">object</span><span class="p_operator">):</span><br>    <span class="p_word">def</span> <span class="p_defname">index</span><span class="p_operator">(</span><span class="p_identifier">self</span><span class="p_operator">):</span><br>        <span class="p_word">return</span> <span class="p_string">"Hello World!"</span><br>    <span class="p_identifier">index</span><span class="p_operator">.</span><span class="p_identifier">exposed</span> <span class="p_operator">=</span> <span class="p_identifier">True</span><br><br><span class="p_identifier"><span class="searchword0">cherrypy</span></span><span class="p_operator">.</span><span class="p_identifier">quickstart</span><span class="p_operator">(</span><span class="p_identifier">HelloWorld</span><span class="p_operator">())</span>
</pre>
</div><img src ="http://www.cppblog.com/riverbird/aggbug/39479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-12-24 10:39 <a href="http://www.cppblog.com/riverbird/archive/2007/12/24/39479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>法律复习材料 2</title><link>http://www.cppblog.com/riverbird/archive/2007/06/01/25251.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Fri, 01 Jun 2007 02:03:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/06/01/25251.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/25251.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/06/01/25251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/25251.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/25251.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.法律的概念法律是指国家制定或认可的，反映统治阶级意志的，依靠国家强制力保证实施的，具有普遍约束性的行为规范的总和。2. 法的本质（1）&nbsp;法律是统治阶级意志的表现（2）&nbsp;法律是上升为国家意志的统治阶级的意志（3）&nbsp;法律归根结底是由统治阶级的物质生活条件决定的3.法的基本特征（1） 法律是一种特殊的社会规范（2）&nbsp;&nbsp; 法是由...&nbsp;&nbsp;<a href='http://www.cppblog.com/riverbird/archive/2007/06/01/25251.html'>阅读全文</a><img src ="http://www.cppblog.com/riverbird/aggbug/25251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-06-01 10:03 <a href="http://www.cppblog.com/riverbird/archive/2007/06/01/25251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>法律复习材料</title><link>http://www.cppblog.com/riverbird/archive/2007/06/01/25250.html</link><dc:creator>江边之鸟</dc:creator><author>江边之鸟</author><pubDate>Fri, 01 Jun 2007 02:02:00 GMT</pubDate><guid>http://www.cppblog.com/riverbird/archive/2007/06/01/25250.html</guid><wfw:comment>http://www.cppblog.com/riverbird/comments/25250.html</wfw:comment><comments>http://www.cppblog.com/riverbird/archive/2007/06/01/25250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/riverbird/comments/commentRss/25250.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/riverbird/services/trackbacks/25250.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 法律的概念：是指国家制定或认可的，反映统治阶级意志的，依靠国家强制力保证实施的，具有普遍约束性的行为规范的总和。法系类型：大陆法系和普通法系。&nbsp;&nbsp;&nbsp;&nbsp; 法律关系由内容、主体、客体三个要素构成。&nbsp; 法的本质（多选）（1）&nbsp;法律是统治阶级意志的表现（2）&nbsp;法律是上升为国家意志的统治阶级的意志（3）&nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/riverbird/archive/2007/06/01/25250.html'>阅读全文</a><img src ="http://www.cppblog.com/riverbird/aggbug/25250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/riverbird/" target="_blank">江边之鸟</a> 2007-06-01 10:02 <a href="http://www.cppblog.com/riverbird/archive/2007/06/01/25250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>