<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>HackGou In Lamp&#124;憨狗点灯 &#187; Python</title>
	<atom:link href="http://hackgou.itbbq.com/category/python/feed" rel="self" type="application/rss+xml" />
	<link>http://hackgou.itbbq.com</link>
	<description>LAMP开放的是代码，是接口，是互操作性</description>
	<lastBuildDate>Thu, 15 Jul 2010 14:23:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>moin wiki农场</title>
		<link>http://hackgou.itbbq.com/moin-wiki%e5%86%9c%e5%9c%ba.html</link>
		<comments>http://hackgou.itbbq.com/moin-wiki%e5%86%9c%e5%9c%ba.html#comments</comments>
		<pubDate>Mon, 29 Mar 2010 02:59:49 +0000</pubDate>
		<dc:creator>HackGou</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://hackgou.itbbq.com/moin-wiki%e5%86%9c%e5%9c%ba.html</guid>
		<description><![CDATA[two parts:

step 0-2. all are required
step 3,4,5. web server configration, you only need one of them.

all these installation are done in $HOME , so don&#8217;t need any root prerogative
step 0. install/upgrade Moin to 1.9.2 (when upgrade, recommend to delete the old release, I didn&#8217;t do this before , that cause a big problem )
install new [...]]]></description>
		<wfw:commentRss>http://hackgou.itbbq.com/moin-wiki%e5%86%9c%e5%9c%ba.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>crawler collection</title>
		<link>http://hackgou.itbbq.com/crawler-collection.html</link>
		<comments>http://hackgou.itbbq.com/crawler-collection.html#comments</comments>
		<pubDate>Fri, 06 Nov 2009 10:15:23 +0000</pubDate>
		<dc:creator>HackGou</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Atomisator]]></category>
		<category><![CDATA[crawler]]></category>
		<category><![CDATA[harvestman]]></category>
		<category><![CDATA[Ruya]]></category>
		<category><![CDATA[scrapy]]></category>
		<category><![CDATA[spider]]></category>
		<category><![CDATA[Webstemmer]]></category>

		<guid isPermaLink="false">http://hackgou.itbbq.com/crwaller-collection.html</guid>
		<description><![CDATA[python based crawler：

Atomisator: http://atomisator.ziade.org/ to build custom RSS feeds
Orchid: http://pypi.python.org/pypi/Orchid/1.1 Orchid is a python crawler I developed for one of my graduate courses. It is a generic multi-threaded web crawler complete with documentation. We used this crawler to locate web pages which contained malicious code. However, the logic of what to do with the crawled [...]]]></description>
		<wfw:commentRss>http://hackgou.itbbq.com/crawler-collection.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>再次质疑Django+M od_python时对环境 变量的处理</title>
		<link>http://hackgou.itbbq.com/%e5%86%8d%e6%ac%a1%e8%b4%a8%e7%96%91djangom-od_python%e6%97%b6%e5%af%b9%e7%8e%af%e5%a2%83-%e5%8f%98%e9%87%8f%e7%9a%84%e5%a4%84%e7%90%86.html</link>
		<comments>http://hackgou.itbbq.com/%e5%86%8d%e6%ac%a1%e8%b4%a8%e7%96%91djangom-od_python%e6%97%b6%e5%af%b9%e7%8e%af%e5%a2%83-%e5%8f%98%e9%87%8f%e7%9a%84%e5%a4%84%e7%90%86.html#comments</comments>
		<pubDate>Thu, 17 Jan 2008 04:12:01 +0000</pubDate>
		<dc:creator>HackGou</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://hackgou.itbbq.com/%e5%86%8d%e6%ac%a1%e8%b4%a8%e7%96%91djangom-od_python%e6%97%b6%e5%af%b9%e7%8e%af%e5%a2%83-%e5%8f%98%e9%87%8f%e7%9a%84%e5%a4%84%e7%90%86.html</guid>
		<description><![CDATA[今天在升级一个django开发的系统到V2的时候，
发现~/无法正确的展开成 /home/hackgou.(apache是以hackgou帐号执行的，)
也不会展开成/root（apache是以root启动的） 觉得非常奇怪，
就算是用os.path.expanduser(&#8216;~/&#8217;)也无济于事。 于是怀疑是os.envrion['HOME']不对，
因为expanduser是需要这个变量来展开~/的。 于是使用setenv HOME /home/hackgou/ 可是也不工作，
后来在django/core/handlers/modpython.py的ModPythonHandler中 发现Django开发组已经注意到，
mod_python不理会apache的setENV指令：
 # mod_python fakes the environ, and thus doesn&#8217;t process SetEnv.  This fixes that
os.environ.update(req.subprocess_env)
但是这个和SetEnv DJANGO_SETTINGS_MODULE app.settings 自相矛盾矛盾，真晕，
自己不设置正确的，也不搭理管理员指定的，怎么办？
后来在http://code.google.com/p/modwsgi/wiki/ApplicationIssues找到一些类似的情况，
 提到sudo的时候有bug，会导致HOME和root启动的HOME不一样，太好了，我就要这样的bug。
设置hackgou账号的sudo权限，然后用sudo来启动apache，果然所有的expanduser(&#8216;~/&#8217;)都顺利。
 除此之外， 文中提到
import os, pwd os.environ["HOME"] = pwd.getpwuid(os.getuid()).pw_dir
这样的代码，似乎可以解决这个问题，神啊，我很反感这种做法：
 1.django中似乎没有地方可以放置这样的需要这个APP都需要的代码，我的DRY啊
2.Django修改环境变量似乎成了习惯，之前碰到个TIME_ZONE的问题，就是因为修改了APACHE的环境变量，
导致 别的应用环境受到污染，要知道一个apache进程是很多应用共享的， 除了Djano还有别的应用，
比如别的Django应用或者PHP，都有可能在一个相同的APACHE进程空间中处理，
说有可能是因为apache本身的一些设置会出现这些差别，跟py没有关系， 这样会导致他们的工作环境受到污染。
这似乎没有好的方法可以解决这个问题， 对Django或者说对mod_python 的这种拖泥带水的做法感觉非常的不爽。
也不知道有没有更好的更彻底的解决方法？
如果谁知道，能够告诉我那是最好不过的了
]]></description>
		<wfw:commentRss>http://hackgou.itbbq.com/%e5%86%8d%e6%ac%a1%e8%b4%a8%e7%96%91djangom-od_python%e6%97%b6%e5%af%b9%e7%8e%af%e5%a2%83-%e5%8f%98%e9%87%8f%e7%9a%84%e5%a4%84%e7%90%86.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>from Crypto import Util 出错</title>
		<link>http://hackgou.itbbq.com/from-crypto-import-util-%e5%87%ba%e9%94%99.html</link>
		<comments>http://hackgou.itbbq.com/from-crypto-import-util-%e5%87%ba%e9%94%99.html#comments</comments>
		<pubDate>Tue, 16 Oct 2007 15:15:02 +0000</pubDate>
		<dc:creator>HackGou</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://hackgou.itbbq.com/from-crypto-import-util-%e5%87%ba%e9%94%99.html</guid>
		<description><![CDATA[在twisted的conch中会使用Crypto
Crypto是pycrypto:http://www.amk.ca/python/code/crypto 中的一个模块。
给python提供许多加密算法支持：
* Hash functions: MD2, MD4, RIPEMD, SHA256.
* Block encryption algorithms: AES, ARC2, Blowfish, CAST, DES, Triple-DES, IDEA, RC5.
* Stream encryption algorithms: ARC4, simple XOR.
* Public-key algorithms: RSA, DSA, ElGamal, qNEW.
* Protocols: All-or-nothing transforms, chaffing/winnowing.
* Miscellaneous: RFC1751 module for converting 128-key keys into a set of English words, primality testing.
* Some demo programs (currently all [...]]]></description>
		<wfw:commentRss>http://hackgou.itbbq.com/from-crypto-import-util-%e5%87%ba%e9%94%99.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>让easy_install构造自己的py thon小天地</title>
		<link>http://hackgou.itbbq.com/%e8%ae%a9easy_install%e6%9e%84%e9%80%a0%e8%87%aa%e5%b7%b1%e7%9a%84py-thon%e5%b0%8f%e5%a4%a9%e5%9c%b0.html</link>
		<comments>http://hackgou.itbbq.com/%e8%ae%a9easy_install%e6%9e%84%e9%80%a0%e8%87%aa%e5%b7%b1%e7%9a%84py-thon%e5%b0%8f%e5%a4%a9%e5%9c%b0.html#comments</comments>
		<pubDate>Mon, 18 Dec 2006 09:18:02 +0000</pubDate>
		<dc:creator>HackGou</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[dreamhost]]></category>

		<guid isPermaLink="false">http://hackgou.itbbq.com/%e8%ae%a9easy_install%e6%9e%84%e9%80%a0%e8%87%aa%e5%b7%b1%e7%9a%84py-thon%e5%b0%8f%e5%a4%a9%e5%9c%b0.html</guid>
		<description><![CDATA[在linux环境中玩、用python，常常需要安装额外的一些python lib
但是由于权限的问题，我们一般是无法往系统中/usr/local之类的目录
里面写东西的，而这些额外的lib又非得需要一个site-packages目录来安装
不可，虽然可以指定pure-lib之类的参数，但是很多时候还是会出错，尤其是现在很多python
lib都是使用的setuptools来生成安装包，更是如此要求了，
[gavin@Korea downloads]$ ll /usr/local/python24/lib/python2.4/site-packages/
total&#160;24
drwxr-xr-x&#160; 2&#160;root root 4096 Dec 18 16:05 PIL
-rw-r--r--&#160; 1&#160;root root&#160; &#160; 4 Dec 18 16:05 PIL.pth
-rw-r--r--&#160; 1&#160;root root&#160; 119 Dec 18 14:59 README
这可麻烦了，每个文件都是root的，旁人只能看，
其实这儿有个很好的解决方法：在自己的目录下面,安装一个虚拟的python：
在自己的目录下面建立一些lib、include等等的目录，构成一个独立的python小天地，这样，系统范围内没有的python库，就可以自己动手安装在自己的小天地中
安装，既不需要root权限，又可以满足自己的需求，一举两得。
这些安装步骤，当然不需要我们重新造轮子，下载
http://peak.telecommunity.com/dist/virtual-python.py
这个脚本，使用你喜欢的python（有的环境提供多个python版本，比如DreamHost）
执行一下这个virtual-python.py，就会自动在~/下面建立所需的目录(~/bin、/lib、
~/include），以及所需python版本，以及创建python所依赖的其他的.h头文件、.py库文件等等软链接，而且会在～/bin/下面copy一个可以执行的python文件，以后直接使用这个~/bin/python来执行py程序，它就会自动找到额外安装在小天地中的那些python库了。如果觉得把bin、lib、include放在~下面不好可以给virtual-python.py指定一个&#8211;prefix参数：
[gavin@Korea bin]$ python24 virtual-python.py --prefix=~/python-lib
[gavin@Korea&#160;bin]$ pwd
/home/gavin/python-lib/bin
[gavin@Korea&#160;bin]$ ll
total&#160;2360
-rwxrwxr-x&#160; 1&#160;gavin gavin 2404367 Dec 18 16:53 python
会把那些bin、lib、include安装在~/python-lib下面，
这下，你就可以使用easy__install来安装自己额外需要的那些库了，
不过等等先，由于此时使用的easy_install是系统范围的，所以它会把东西安装在
/usr/local之类的目录下，所以我们得给我们自己的环境安装一个easy_install。
下载
wget http://peak.telecommunity.com/dist/ez_setup.py
~/python-lib/bin/python&#160;ez_setup.py
Downloading&#160;http://cheeseshop.python.org/packages/2.4/s/setuptools/setuptools-0.6c3-py2.4.egg
Processing&#160;setuptools-0.6c3-py2.4.egg
creating /home/gavin/python-lib/lib/python2.4/site-packages/setuptools-0.6c3-py2.4.egg
Extracting&#160;setuptools-0.6c3-py2.4.egg to
/home/gavin/python-lib/lib/python2.4/site-packages
Adding&#160;setuptools 0.6c3 to easy-install.pth file
Installing&#160;easy_install script to /home/gavin/python-lib/bin
Installing&#160;easy_install-2.4 script to /home/gavin/python-lib/bin
&#160;
Installed /home/gavin/python-lib/lib/python2.4/site-packages/setuptools-0.6c3-py2.4.egg
Processing&#160;dependencies for [...]]]></description>
		<wfw:commentRss>http://hackgou.itbbq.com/%e8%ae%a9easy_install%e6%9e%84%e9%80%a0%e8%87%aa%e5%b7%b1%e7%9a%84py-thon%e5%b0%8f%e5%a4%a9%e5%9c%b0.html/feed</wfw:commentRss>
		<slash:comments>38</slash:comments>
		</item>
		<item>
		<title>SQLObject加MySQL的 utf-8解决之道</title>
		<link>http://hackgou.itbbq.com/sqlobject%e5%8a%a0mysql%e7%9a%84-utf-8%e8%a7%a3%e5%86%b3%e4%b9%8b%e9%81%93.html</link>
		<comments>http://hackgou.itbbq.com/sqlobject%e5%8a%a0mysql%e7%9a%84-utf-8%e8%a7%a3%e5%86%b3%e4%b9%8b%e9%81%93.html#comments</comments>
		<pubDate>Thu, 07 Dec 2006 08:12:01 +0000</pubDate>
		<dc:creator>HackGou</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[SQLObject]]></category>

		<guid isPermaLink="false">http://hackgou.itbbq.com/sqlobject%e5%8a%a0mysql%e7%9a%84-utf-8%e8%a7%a3%e5%86%b3%e4%b9%8b%e9%81%93.html</guid>
		<description><![CDATA[SQLObject对utf-8的支持一直为很多人所诟病，MySQL对utf-8的支持
在mysqlconnection.py中可以看到SQLObject连接MySQL时的一些细节，
__init__中支持额外的几个参数
self.need_unicode = False
&#160; &#160; &#160; &#160; for&#160;key in (&#34;unix_socket&#34;, &#34;init_command&#34;,
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#34;read_default_file&#34;, &#34;read_default_group&#34;):
&#160; &#160; &#160; &#160; &#160; &#160; if&#160;key in kw: 
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; self.kw[key] = col.popKey(kw, key)
&#160; &#160; &#160; &#160; for&#160;key in (&#34;connect_timeout&#34;, &#34;compress&#34;, &#34;named_pipe&#34;, &#34;use_unicode&#34;,
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; [...]]]></description>
		<wfw:commentRss>http://hackgou.itbbq.com/sqlobject%e5%8a%a0mysql%e7%9a%84-utf-8%e8%a7%a3%e5%86%b3%e4%b9%8b%e9%81%93.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SPUG聚会</title>
		<link>http://hackgou.itbbq.com/spug%e8%81%9a%e4%bc%9a.html</link>
		<comments>http://hackgou.itbbq.com/spug%e8%81%9a%e4%bc%9a.html#comments</comments>
		<pubDate>Mon, 13 Nov 2006 15:27:06 +0000</pubDate>
		<dc:creator>HackGou</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://hackgou.itbbq.com/spug%e8%81%9a%e4%bc%9a.html</guid>
		<description><![CDATA[周日参加了SPUG的聚会，预定14:00开始，我12:00从金桥出发，紧赶慢赶，到达华师大理科大楼A座328楼的时候， 还是错过了开场，都已经开始了！正好撞见Gary正在问一位演讲的Pythoner“有没有什么可以参考的数据可以 说明性能问题”。呵呵，这个我感兴趣——早先玩Plone的时候觉得这个东西在性能方面的确不尽人意，不过本来 benchmark的测试是一门非常讲究的东西，而且考量起来也是比较复杂的，所以这位Pythoner也无法提供准确的数 字，后来向旁边的一位Pythoner（后来得知这是Bruce Wang）打听：台上这位是谁？知道这便是人们口中的老 潘：潘俊勇，呵呵，原来这家伙不如想象中的那么勇哈，瘦精瘦精的，我虽然知道这次演讲的除了潘俊勇之外， 还有网易的沈崴、Movoto.com的陈世欣，我是第一次参加SPUG，自然这些面孔，我都是第一次见着  :P 接下来有些意外的是一位位法国朋友的演讲,意外的是没想到还有来自法国的朋友，更加没有想到的是他们为此 还做了非常充分的准备，这在他们的演示中就可以看出来，而且后来在他们projects show的时候，更是让人大开 眼界：Plone以及完全融入了他们的生活，Python也完全融进了他们的骨髓！呵呵，虽然现在还不知道两位叫什么  :D
在接下来陈世欣的演讲中提到他们公司的运维模式，觉得非常熟悉：和我们公司一样，development在上海、 market在美国。在development方面不同的是他们公司中Python已经完全融入日常工作中了，而且实践也证明： python的这个胶水非常出色，但是在我们公司便不是这样的：放眼望去PHP/Java/C/c++的一片，Python的寥寥耳！ Python的应用，其实不是能不能用的问题，更多的恐怕还是后期的运维以及商业风险的问题！ 本来打算和我一起参加SPUG的PM——Yong这家伙也临时有事，没法参加， 除了Python方面的东西，陈世欣还提到一个东西：map  API，这个东西其实不光google有、yahoo有、那个M$也有， 他提到他们非常广泛的使用这些免费或者商业授权的API，作为业务的分非常重要的数据库，我便想到 最近刚刚 上线的toseeka，两者何其相似！toseeka做的甚至更加过火：除了comment自己的，其余完全是基于web API，随着 网络化的成熟，基于网络的API恐怕得和本地的API扮演的同样的角色了，而且无持久连接的http嫣然是web based API的天然载体，本来这是一个缺陷，现在看来API server就只作response，不用维护持久连接这个特征，反而是一个 好处了！
后来轮到沈崴讲，呵呵，不愧是为老鸟，其中的很多话题都是非常令人着迷的，其中的很多话题，在我这边都是零碎的， 不成系统，他已经可以拿出手给大家指点一二了！可是时间非常有限，ppt（我居然在http: //www.mangbar.com/task/docview/bd18e8290e8d0235010ea12fdd660312 中没有找到他的ppt）中的很多饶有兴趣的话题，大多只蜻蜓点水般三言两语掠过，而且这家伙在list里面有见首不见尾， 憾事！现在想起来对他提到的一个东西比较感到新奇：把Plone作为一个DB Server，一个http session便是一个connection。 呵呵，有点意思！
后面计划中的金庆(正在翻译PP3eD)，演讲题目是Python编程之C扩展模块简例。 可是由于时间的原因，也没有看成。
时间也不早了，刚刚从太阳岛回来，膀子一点酸，休息！
]]></description>
		<wfw:commentRss>http://hackgou.itbbq.com/spug%e8%81%9a%e4%bc%9a.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python线程编程（三）同步队列</title>
		<link>http://hackgou.itbbq.com/python%e7%ba%bf%e7%a8%8b%e7%bc%96%e7%a8%8b%ef%bc%88%e4%b8%89%ef%bc%89%e5%90%8c%e6%ad%a5%e9%98%9f%e5%88%97.html</link>
		<comments>http://hackgou.itbbq.com/python%e7%ba%bf%e7%a8%8b%e7%bc%96%e7%a8%8b%ef%bc%88%e4%b8%89%ef%bc%89%e5%90%8c%e6%ad%a5%e9%98%9f%e5%88%97.html#comments</comments>
		<pubDate>Tue, 24 Oct 2006 09:18:07 +0000</pubDate>
		<dc:creator>blog</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://hackgou.itbbq.com/python%e7%ba%bf%e7%a8%8b%e7%bc%96%e7%a8%8b%ef%bc%88%e4%b8%89%ef%bc%89%e5%90%8c%e6%ad%a5%e9%98%9f%e5%88%97.html</guid>
		<description><![CDATA[   我们经常会采用生产者/消费者关系的两个线程来处理一个共享缓冲区的数据。
例如一个生产者线程接受用户数据放入一个共享缓冲区里，等待一个消费者线程对
数据取出处理。但是如果缓冲区的太小而生产者和消费者两个异步线程的速度不同
时，容易出现一个线程等待另一个情况。为了尽可能的缩短共享资源并以相同速度
工作的各线程的等待时间，我们可以使用一个“队列”来提供额外的缓冲区。
此文章转自:
http://users.ir-lab.org/~bill_lang/blog10/archives/001837.html
此篇为其第三部分
看到URL中包含~bill_lang，知道这是bill_lang的个人地方，由于担心
好东西说不定那天就没了，所以全文转载过来。但是不知道bill_lang从
什么地方转载过来的,没法给出原文的链接了！
创建一个“队列”对象
import Queue
myqueue = Queue.Queue(maxsize = 10)
Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过
Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队
列长度无限。
将一个值放入队列中
myqueue.put(10)
调用队列对象的put()方法在队尾插入一个项目。put()有两个参数，第一个item为
必需的，为插入项目的值；第二个block为可选参数，默认为1。如果队列当前为空
且block为1，put()方法就使调用线程暂停,直到空出一个数据单元。如果block为
0，put方法将引发Full异常。
将一个值从队列中取出
myqueue.get()
调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block，默认为
1。如果队列为空且block为1，get()就使调用线程暂停，直至有项目可用。如果
block为0，队列将引发Empty异常。
我们用一个例子来展示如何使用Queue
# queue_example.py
from&#160;Queue import Queue
import&#160;threading
import&#160;random
import&#160;time
&#160;
# Producer thread
class&#160;Producer(threading.Thread):
&#160; &#160; &#160;&#160; def&#160;__init__(self, threadname, queue):
&#160; &#160; &#160; &#160; &#160; &#160; threading.Thread.__init__(self, name = threadname)
&#160; &#160; &#160; &#160; &#160; &#160; self.sharedata = queue
&#160; &#160; &#160;&#160; def&#160;run(self):
&#160; &#160; &#160; &#160; &#160; &#160; for&#160;i in range(20):
&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&#160; print&#160;self.getName(),'adding',i,'to [...]]]></description>
		<wfw:commentRss>http://hackgou.itbbq.com/python%e7%ba%bf%e7%a8%8b%e7%bc%96%e7%a8%8b%ef%bc%88%e4%b8%89%ef%bc%89%e5%90%8c%e6%ad%a5%e9%98%9f%e5%88%97.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python线程编程（二）简单的线程同步</title>
		<link>http://hackgou.itbbq.com/python%e7%ba%bf%e7%a8%8b%e7%bc%96%e7%a8%8b%ef%bc%88%e4%ba%8c%ef%bc%89%e7%ae%80%e5%8d%95%e7%9a%84%e7%ba%bf%e7%a8%8b%e5%90%8c%e6%ad%a5.html</link>
		<comments>http://hackgou.itbbq.com/python%e7%ba%bf%e7%a8%8b%e7%bc%96%e7%a8%8b%ef%bc%88%e4%ba%8c%ef%bc%89%e7%ae%80%e5%8d%95%e7%9a%84%e7%ba%bf%e7%a8%8b%e5%90%8c%e6%ad%a5.html#comments</comments>
		<pubDate>Tue, 24 Oct 2006 09:18:02 +0000</pubDate>
		<dc:creator>blog</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://hackgou.itbbq.com/python%e7%ba%bf%e7%a8%8b%e7%bc%96%e7%a8%8b%ef%bc%88%e4%ba%8c%ef%bc%89%e7%ae%80%e5%8d%95%e7%9a%84%e7%ba%bf%e7%a8%8b%e5%90%8c%e6%ad%a5.html</guid>
		<description><![CDATA[Python线程编程（二）简单的线程同步
    多个执行线程经常要共享数据，如果仅仅读取共享数据还好，但是如果多个线
程要修改共享数据的话就可能出现无法预料的结果。
    假如两个线程对象t1和t2都要对数值num=0进行增1运算，那么t1和t2都各对
num修改10次的话，那么num最终的结果应该为20。但是如果当t1取得num的值时
（假如此时num为0），系统把t1调度为“sleeping”状态，而此时t2转换为
“running”状态，此时t2获得的num的值也为0，然后他把num+1的值1赋给num。系统
又把t2转化为“sleeping”状态，t1为“running”状态，由于t1已经得到num值为0，
所以他也把num+1的值赋给了num为1。本来是2次增1运行，结果却是num只增了1
次。类似这样的情况在多线程同时执行的时候是有可能发生的。所以为了防止这类
情况的出现就要使用线程同步机制。
    最简单的同步机制就是“锁”
    锁对象用threading.RLock类创建
mylock = threading.RLock()
    如何使用锁来同步线程呢？线程可以使用锁的acquire() （获得）方法，这样
锁就进入“locked”状态。每次只有一个线程可以获得锁。如果当另一个线程试图获
得这个锁的时候，就会被系统变为“blocked”状态，直到那个拥有锁的线程调用锁
的release() （释放）方法，这样锁就会进入“unlocked”状态。“blocked”状态的
线程就会收到一个通知，并有权利获得锁。如果多个线程处于“blocked”状态，所
有线程都会先解除“blocked”状态，然后系统选择一个线程来获得锁，其他的线程
继续沉默（“blocked”）。
import threading
mylock = threading.RLock()
class&#160;mythread(threading.Thread)
&#160; &#160; ...
&#160; &#160; def&#160;run(self ...):
&#160; &#160; &#160; &#160; ...&#160; &#160;&#160; #此处 不可以 放置修改共享数据的代码
&#160; &#160; &#160; &#160; mylock.acquire()
&#160; &#160; &#160; &#160; ...&#160; &#160;&#160; #此处 可以 放置修改共享数据的代码
&#160; &#160; &#160; [...]]]></description>
		<wfw:commentRss>http://hackgou.itbbq.com/python%e7%ba%bf%e7%a8%8b%e7%bc%96%e7%a8%8b%ef%bc%88%e4%ba%8c%ef%bc%89%e7%ae%80%e5%8d%95%e7%9a%84%e7%ba%bf%e7%a8%8b%e5%90%8c%e6%ad%a5.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python多线程编程(一) 线程对象</title>
		<link>http://hackgou.itbbq.com/python%e5%a4%9a%e7%ba%bf%e7%a8%8b%e7%bc%96%e7%a8%8b1-%e7%ba%bf%e7%a8%8b%e5%af%b9%e8%b1%a1.html</link>
		<comments>http://hackgou.itbbq.com/python%e5%a4%9a%e7%ba%bf%e7%a8%8b%e7%bc%96%e7%a8%8b1-%e7%ba%bf%e7%a8%8b%e5%af%b9%e8%b1%a1.html#comments</comments>
		<pubDate>Tue, 24 Oct 2006 09:15:04 +0000</pubDate>
		<dc:creator>blog</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://hackgou.itbbq.com/python%e5%a4%9a%e7%ba%bf%e7%a8%8b%e7%bc%96%e7%a8%8b1-%e7%ba%bf%e7%a8%8b%e5%af%b9%e8%b1%a1.html</guid>
		<description><![CDATA[此文章转自:
http://users.ir-lab.org/~bill_lang/blog10/archives/001837.html
看到URL中包含~bill_lang，知道这是bill_lang的个人地方，由于担心
好东西说不定那天就没了，所以全文转载过来。但是不知道bill_lang从
什么地方转载过来的
Python多线程编程[Zz]
Python线程编程（一）线程对象
我们在做软件开发的时候很多要用到多线程技术。例如如果做一个下载软件象
flashget就要用到、象在线视频工具realplayer也要用到因为要同时下载media
stream还要播放。其实例子是很多的。
线程相对进程来说是“轻量级”的，操作系统用较少的资源创建和管理线程。程序中
的线程在相同的内存空间中执行，并共享许多相同的资源。
在python中如何创建一个线程对象
如果你要创建一个线程对象，很简单，只要你的类继承threading.Thread，然后在
__init__里首先调用threading.Thread的__init__方法即可
import threading
class&#160;mythread(threading.Thread):
def&#160;__init__(self, threadname):
threading.Thread.__init__(self, name = threadname)
....
这才仅仅是个空线程，我可不是要他拉空车的，他可得给我干点实在活。很简单，
重写类的run()方法即可，把你要在线程执行时做的事情都放到里面
import threading
import&#160;time
class&#160;mythread(threading.Thread):
def&#160;__init__(...):
....
def&#160;run(self):
for&#160;i in range(10):
print&#160;self.getName, i
time.sleep(1)
以上代码我们让这个线程在执行之后每隔1秒输出一次信息到屏幕，10次后结束
getName()是threading.Thread类的一个方法，用来获得这个线程对象的name。还
有一个方法setName()当然就是来设置这个线程对象的name的了。
如果要创建一个线程，首先就要先创建一个线程对象
mythread1 = mythread('mythread 1')
一个线程对象被创建后，他就处于“born”（诞生状态）
如何让这个线程对象开始运行呢?只要调用线程对象的start()方法即可
mythread1.start()
现在线程就处于“ready”状态或者也称为“runnable”状态。
奇怪吗？不是已经start了吗？为什么不称为“running”状态呢？其实是有原因的。
因为我们的计算机一般是不具有真正并行处理能力的。我们所谓的多线程只是把时
间分成片段，然后隔一个时间段就让一个线程执行一下，然后进入“sleeping ”状
态，然后唤醒另一个在“sleeping”的线程，如此循环runnable->sleeping->
runnable&#8230; ，只是因为计算机执行速度很快，而时间片段间隔很小，我们感受不
到，以为是同时进行的。所以说一个线程在start了之后只是处在了可以运行的状
态，他什么时候运行还是由系统来进行调度的。
那一个线程什么时候会“dead”呢？一般来说当线程对象的run方法执行结束或者在
执行中抛出异常的话，那么这个线程就会结束了。系统会自动对“dead”状态线程进
行清理。
如果一个线程t1在执行的过程中需要等待另一个线程t2执行结束后才能运行的话那
就可以在t1在调用t2的join()方法
....
def&#160;t1(...):
...
t2.join()
...
这样t1在执行到t2.join()语句后就会等待t2结束后才会继续运行。
但是假如t1是个死循环的话那么等待就没有意义了，那怎么办呢？可以在调用t2的
join()方法的时候给一个浮点数做超时参数，这样这个线程就不会等到花儿也谢了
了。我等你10s，你不回来我还不允许我改嫁啊？:)
def t1(...):
...
t2.join(10)
...
如果一个进程的主线程运行完毕而子线程还在执行的话，那么进程就不会退出，直
到所有子线程结束为止，如何让主线程结束的时候其他子线程也乖乖的跟老大撤退
呢？那就要把那些不听话的人设置为听话的小弟，使用线程对象的setDaemon()方
法，参数为bool型。True的话就代表你要听话，我老大（主线程）扯呼，你也要跟
着撤，不能拖后腿。如果是False的话就不用那么听话了，老大允许你们将在外军
命有所不受的。需要注意的是setDaemon()方法必须在线程对象没有调用start()方
法之前调用，否则没效果。
t1 = mythread('t1')
print&#160;t1.getName(),t1.isDaemon()
t1.setDaemon(True)
print&#160;t1.getName(),t1.isDaemon()
t1.start()
print&#160;'main thread exit'
当执行到 print &#8216;main thread exit&#8217; 后，主线程就退出了，当然t1这个线程也跟
着结束了。但是如果不使用t1线程对象的setDaemon()方法的话，即便主线程结束
了，还要等待t1线程自己结束才能退出进程。isDaemon()是用来获得一个线程对象
的Daemonflag状态的。
如何来获得与线程有关的信息呢？
获得当前正在运行的线程的引用
running = threading.currentThread()
获得当前所有活动对象（即run方法开始但是未终止的任何线程）的一个列表
threadlist = threading.enumerate()
获得这个列表的长度
threadcount = threading.activeCount()
查看一个线程对象的状态调用这个线程对象的isAlive()方法，返回1代表处于
“runnable”状态且没有“dead”
threadflag = threading.isAlive()
]]></description>
		<wfw:commentRss>http://hackgou.itbbq.com/python%e5%a4%9a%e7%ba%bf%e7%a8%8b%e7%bc%96%e7%a8%8b1-%e7%ba%bf%e7%a8%8b%e5%af%b9%e8%b1%a1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
