<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_iTech's Blog</title><subtitle type="text">关注： 软件配置管理 + 软件持续集成 + 软件自动化发布兴趣： 虚拟化 + 存储 + 集群 + 数据库 + Linux订阅本博客 + 我的C++博客</subtitle><id>http://feed.cnblogs.com/blog/u/50245/rss</id><updated>2012-02-09T11:26:36Z</updated><author><name>iTech</name><uri>http://www.cnblogs.com/itech/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itech/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/50245/rss"/><entry><id>http://www.cnblogs.com/itech/archive/2012/02/09/2344435.html</id><title type="text">Gird Engine 是什么？</title><summary type="text">一 Gird EngineGird Engine 指的是SGE(Sun Gird Engine)，是一个开源免费的batch-queuing 系统用来对分布式资源的管理。典型地他将被应用于计算机farm和高性能计算cluster，用来接收，schedule，分发和管理远程和分布式的大量的独立，并行的非交互的jobs，他也可以管理和schedule分布式资源的分配，例如处理器，内存，硬盘和软件license。简单地说就是将任务打包为job分发到计算机集中执行。在Sun后来被Oracle收购后，从SGE延伸的开源产品为：http://gridscheduler.sourceforge.net/基于</summary><published>2012-02-09T11:27:00Z</published><updated>2012-02-09T11:27:00Z</updated><author><name>iTech</name><uri>http://www.cnblogs.com/itech/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itech/archive/2012/02/09/2344435.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itech/archive/2012/02/09/2344435.html"/><content type="html">&lt;div&gt;&lt;div style="font-family: 微软雅黑; font-size: 18px; line-height: normal; "&gt;&lt;br /&gt;一 Gird Engine&lt;/div&gt;&lt;div style="font-family: 微软雅黑; font-size: 18px; line-height: normal; "&gt;Gird Engine 指的是SGE(Sun Gird Engine)，是一个开源免费的batch-queuing 系统用来对分布式资源的管理。典型地他将被应用于计算机farm和高性能计算cluster，用来接收，schedule，分发和管理远程和分布式的大量的独立，并行的非交互的jobs，他也可以管理和schedule分布式资源的分配，例如处理器，内存，硬盘和软件license。简单地说就是将任务打包为job分发到计算机集中执行。&lt;/div&gt;&lt;div style="font-family: 微软雅黑; font-size: 18px; line-height: normal; "&gt;&lt;/div&gt;&lt;div style="font-family: 微软雅黑; font-size: 18px; line-height: normal; "&gt;在Sun后来被Oracle收购后，从SGE延伸的开源产品为：&lt;/div&gt;&lt;a href="http://gridscheduler.sourceforge.net/" style="cursor: pointer; font-family: 微软雅黑; font-size: 18px; line-height: normal; "&gt;http://gridscheduler.sourceforge.net/&lt;/a&gt;&amp;nbsp;&lt;div style="font-family: 微软雅黑; font-size: 18px; line-height: normal; "&gt;&lt;br /&gt;&lt;div&gt;基于SGE开发的且提供企业级服务的为UGE(Univa Gird Engine)：&lt;br /&gt;&lt;div&gt;&lt;a href="http://www.univa.com/" style="cursor: pointer; "&gt;http://www.univa.com/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;当然了Oracle在收购了Sun后改名为OGE（Oracle Gird Engine)且不免费：&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.oracle.com/technetwork/oem/grid-engine-166852.html?ssSourceSiteId=ocomen" style="cursor: pointer; "&gt;http://www.oracle.com/technetwork/oem/grid-engine-166852.html?ssSourceSiteId=ocomen&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;其他关于SGE：&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.gridengine.info/" style="cursor: pointer; "&gt;http://www.gridengine.info/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;二 Gird Engine 的特点&lt;/div&gt;&lt;div&gt;* 多个高级的scheduling算法，从而允许基于多种策略的资源分配；&lt;/div&gt;&lt;div&gt;* cluster queues；&lt;/div&gt;&lt;div&gt;* job和scheduler错误冗余；&lt;/div&gt;&lt;div&gt;* job checkpointing；&lt;/div&gt;&lt;div&gt;* job 数组和job 任务；&lt;/div&gt;&lt;div&gt;* Distributed Resource Management And Access （job API），支持perl，python，java，c++等语言；&lt;/div&gt;&lt;div&gt;* 资源的保留；&lt;/div&gt;&lt;div&gt;* 基于xml的状态报告；&lt;/div&gt;&lt;div&gt;* 并行的job（MPI，PVM，OpenMP),使用qrsh实现可伸缩并行job的启动；&lt;/div&gt;&lt;div&gt;* 使用率统计；&lt;/div&gt;&lt;div&gt;* 并行的make，distmake，dmake，qmake；&lt;/div&gt;&lt;div&gt;* 支持几乎所有的系统，例如*unix,windows,Mac;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;三 Gird Engine的架构和工作&lt;/div&gt;&lt;div&gt;典型的Gird Engine cluster包含了一个master host和一个或多个execution hosts。但是也可以设置多个shadow masters作为主master的后备，当主master出问题的时候，多个shadow masters可以代替主master继续工作。所有的execution hosts安装有gird engine execution daemon， master host装有qmaster daemon， shadow mater运行了shadow daemon。qmaster用来提交和schedule job到execution hosts。&lt;/div&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/itech/news/girdengine.PNG" width="572" height="323" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;使用实例参考：&lt;/div&gt;&lt;p&gt;例如EDA软件公司Mentor Graphics使用Gird Engine来管理所有的regression tests。 为了测试他们的软件，他们提交数千的jobs到gird或cluster中运行。gird engine使得所有的机器能够被充分地被利用，当一个机器完成了一个测试用例的运行，gird engine将提交另一个job给他，直到所有的测试运行结束。gird engine还可以用来管理licenses。&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;四 其他&lt;/div&gt;&lt;div&gt;platform Load Sharing Facility（LSF）&amp;nbsp;&lt;a href="http://www.platform.com/" style="cursor: pointer; "&gt;http://www.platform.com/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;参考：http://www.oracle.com/technetwork/oem/host-server-mgmt/twp-gridengine-overview-167117.pdf&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;完！&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/itech/aggbug/2344435.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itech/archive/2012/02/09/2344435.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itech/archive/2012/01/10/2318430.html</id><title type="text">Python分布式+云计算</title><summary type="text">参考：http://wiki.python.org/moin/ParallelProcessinghttp://wiki.python.org/moin/DistributedProgramming分布式：http://www.celeryproject.org/http://www.parallelpython.com/http://code.google.com/p/distributed-python-for-scripting/http://code.google.com/p/superpy/http://code.google.com/appengine/cloud：http://w</summary><published>2012-01-10T10:36:00Z</published><updated>2012-01-10T10:36:00Z</updated><author><name>iTech</name><uri>http://www.cnblogs.com/itech/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itech/archive/2012/01/10/2318430.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itech/archive/2012/01/10/2318430.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;参考：&lt;/p&gt;&lt;p&gt;&lt;a href="http://wiki.python.org/moin/ParallelProcessing"&gt;http://wiki.python.org/moin/ParallelProcessing&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://wiki.python.org/moin/DistributedProgramming"&gt;http://wiki.python.org/moin/DistributedProgramming&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;分布式：&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.celeryproject.org/"&gt;http://www.celeryproject.org/&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;a href="http://www.parallelpython.com/"&gt;http://www.parallelpython.com/&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;a href="http://code.google.com/p/distributed-python-for-scripting/"&gt;http://code.google.com/p/distributed-python-for-scripting/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.google.com/p/superpy/"&gt;http://code.google.com/p/superpy/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.google.com/appengine/"&gt;http://code.google.com/appengine/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;cloud：&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.picloud.com/"&gt;http://www.picloud.com/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://libcloud.apache.org/"&gt;http://libcloud.apache.org/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;new things：&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.heroku.com/"&gt;http://www.heroku.com/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pythonanywhere.com/"&gt;http://www.pythonanywhere.com/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;完！&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/itech/aggbug/2318430.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itech/archive/2012/01/10/2318430.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itech/archive/2012/01/10/2318293.html</id><title type="text">python类库32[序列化和反序列化之pickle]</title><summary type="text">一 picklepickle模块用来实现python对象的序列化和反序列化。通常地pickle将python对象序列化为二进制流或文件。python对象与文件之间的序列化和反序列化：pickle.dump()pickle.load()如果要实现python对象和字符串间的序列化和反序列化，则使用：pickle.dumps()pickle.loads()可以被序列化的类型有：* None,True 和 False;* 整数，浮点数，复数;* 字符串，字节流，字节数组;* 包含可pickle对象的tuples，lists，sets和dictionaries；* 定义在module顶层的函数：* 定</summary><published>2012-01-10T09:49:00Z</published><updated>2012-01-10T09:49:00Z</updated><author><name>iTech</name><uri>http://www.cnblogs.com/itech/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itech/archive/2012/01/10/2318293.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itech/archive/2012/01/10/2318293.html"/><content type="html">&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;一 pickle&lt;/p&gt;&lt;div&gt;pickle模块用来实现python对象的序列化和反序列化。通常地pickle将python对象序列化为二进制流或文件。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;python对象与文件之间的序列化和反序列化：&lt;/div&gt;&lt;div&gt;pickle.dump()&lt;/div&gt;&lt;div&gt;pickle.load()&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;如果要实现python对象和字符串间的序列化和反序列化，则使用：&lt;/div&gt;&lt;div&gt;pickle.dumps()&lt;/div&gt;&lt;div&gt;pickle.loads()&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;可以被序列化的类型有：&lt;/div&gt;&lt;div&gt;* None,True 和 False;&lt;/div&gt;&lt;div&gt;* 整数，浮点数，复数;&lt;/div&gt;&lt;div&gt;* 字符串，字节流，字节数组;&lt;/div&gt;&lt;div&gt;* 包含可pickle对象的tuples，lists，sets和dictionaries；&lt;/div&gt;&lt;div&gt;* 定义在module顶层的函数：&lt;/div&gt;&lt;div&gt;* 定义在module顶层的内置函数；&lt;/div&gt;&lt;div&gt;* 定义在module顶层的类；&lt;/div&gt;&lt;div&gt;* 拥有__dict__()或__setstate__()的自定义类型；&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;注意：对于函数或类的序列化是以名字来识别的，所以需要import相应的module。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;二 pickle的运行过程&lt;/p&gt;&lt;div&gt;在大部分情况下，要是的对象picklable，我们不需要额外的代码。默认地pickle将智能地检查类和实例的属性，当一个类实例反序列化的时候，它的__init__()方法通常不被调用。而是首先创建一个未初始化的实例，然后再回复存储的属性。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;但是可以通过实现下列的方法来修改默认的行为：&lt;/div&gt;&lt;div&gt;object.__getstate__() :默认地序列化对象的__dict__,但是如果你实现了__getstate__(),则__getstate__()函数返回的值将被序列化。&lt;/div&gt;&lt;div&gt;object.__setstate__(state) :如果类型实现了此方法，则在反序列化的时候，此方法用来恢复对象的属性。&lt;/div&gt;&lt;div&gt;object.__getnewargs__() ： 如果实例构造的时候（__new__()）需要参数，则需要实现此函数。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;注意：如果__getstate__()返回False，则在反序列化的时候__setstate__()则不被调用。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;有的时候为了效率，或上面的3个函数不能满足需求时，需要实现__reduce__()函数。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;三 实例&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;pickle&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;An&amp;nbsp;arbitrary&amp;nbsp;collection&amp;nbsp;of&amp;nbsp;objects&amp;nbsp;supported&amp;nbsp;by&amp;nbsp;pickle.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;data&amp;nbsp;=&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;:&amp;nbsp;[1,&amp;nbsp;2.0,&amp;nbsp;3,&amp;nbsp;4+6j],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;b&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;:&amp;nbsp;(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;character&amp;nbsp;string&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;b&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;byte&amp;nbsp;string&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;c&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;:&amp;nbsp;set([None,&amp;nbsp;True,&amp;nbsp;False])&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;with&amp;nbsp;open(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;data.pickle&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;wb&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&amp;nbsp;as&amp;nbsp;f:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Pickle&amp;nbsp;the&amp;nbsp;'data'&amp;nbsp;dictionary&amp;nbsp;using&amp;nbsp;the&amp;nbsp;highest&amp;nbsp;protocol&amp;nbsp;available.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pickle.dump(data,&amp;nbsp;f,&amp;nbsp;pickle.HIGHEST_PROTOCOL)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;with&amp;nbsp;open(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;data.pickle&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;rb&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&amp;nbsp;as&amp;nbsp;f:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;The&amp;nbsp;protocol&amp;nbsp;version&amp;nbsp;used&amp;nbsp;is&amp;nbsp;detected&amp;nbsp;automatically,&amp;nbsp;so&amp;nbsp;we&amp;nbsp;do&amp;nbsp;not&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;have&amp;nbsp;to&amp;nbsp;specify&amp;nbsp;it.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;pickle.load(f)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(str(data))&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;四 修改picklable类型的默认行为&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;TextReader:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000;"&gt;"""&lt;/span&gt;&lt;span style="color: #800000;"&gt;Print&amp;nbsp;and&amp;nbsp;number&amp;nbsp;lines&amp;nbsp;in&amp;nbsp;a&amp;nbsp;text&amp;nbsp;file.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"""&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__init__&lt;/span&gt;(self,&amp;nbsp;filename):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.filename&amp;nbsp;=&amp;nbsp;filename&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.file&amp;nbsp;=&amp;nbsp;open(filename)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.lineno&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;readline(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.lineno&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;line&amp;nbsp;=&amp;nbsp;self.file.readline()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;not&lt;/span&gt;&amp;nbsp;line:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;None&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;line.endswith(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;line&amp;nbsp;=&amp;nbsp;line[:-1]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%i:&amp;nbsp;%s&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;%&amp;nbsp;(self.lineno,&amp;nbsp;line)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__getstate__&lt;/span&gt;(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Copy&amp;nbsp;the&amp;nbsp;object's&amp;nbsp;state&amp;nbsp;from&amp;nbsp;self.__dict__&amp;nbsp;which&amp;nbsp;contains&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;all&amp;nbsp;our&amp;nbsp;instance&amp;nbsp;attributes.&amp;nbsp;Always&amp;nbsp;use&amp;nbsp;the&amp;nbsp;dict.copy()&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;method&amp;nbsp;to&amp;nbsp;avoid&amp;nbsp;modifying&amp;nbsp;the&amp;nbsp;original&amp;nbsp;state.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;state&amp;nbsp;=&amp;nbsp;self.&lt;span style="color: #800080;"&gt;__dict__&lt;/span&gt;.copy()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Remove&amp;nbsp;the&amp;nbsp;unpicklable&amp;nbsp;entries.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;del&lt;/span&gt;&amp;nbsp;state[&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;file&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;state&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__setstate__&lt;/span&gt;(self,&amp;nbsp;state):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Restore&amp;nbsp;instance&amp;nbsp;attributes&amp;nbsp;(i.e.,&amp;nbsp;filename&amp;nbsp;and&amp;nbsp;lineno).&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.&lt;span style="color: #800080;"&gt;__dict__&lt;/span&gt;.update(state)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Restore&amp;nbsp;the&amp;nbsp;previously&amp;nbsp;opened&amp;nbsp;file's&amp;nbsp;state.&amp;nbsp;To&amp;nbsp;do&amp;nbsp;so,&amp;nbsp;we&amp;nbsp;need&amp;nbsp;to&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;reopen&amp;nbsp;it&amp;nbsp;and&amp;nbsp;read&amp;nbsp;from&amp;nbsp;it&amp;nbsp;until&amp;nbsp;the&amp;nbsp;line&amp;nbsp;count&amp;nbsp;is&amp;nbsp;restored.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file&amp;nbsp;=&amp;nbsp;open(self.filename)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;_&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;range(self.lineno):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file.readline()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Finally,&amp;nbsp;save&amp;nbsp;the&amp;nbsp;file.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.file&amp;nbsp;=&amp;nbsp;file&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;reader&amp;nbsp;=&amp;nbsp;TextReader(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;hello.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(reader.readline())&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(reader.readline())&lt;br /&gt;s&amp;nbsp;=&amp;nbsp;pickle.dumps(reader)&lt;br /&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;print(s)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;new_reader&amp;nbsp;=&amp;nbsp;pickle.loads(s)&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(new_reader.readline())&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;the&amp;nbsp;output&amp;nbsp;is&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;1:&amp;nbsp;hello&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;2:&amp;nbsp;how&amp;nbsp;are&amp;nbsp;you&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;3:&amp;nbsp;goodbye&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;完！&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/itech/aggbug/2318293.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itech/archive/2012/01/10/2318293.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itech/archive/2012/01/10/2318178.html</id><title type="text">python类库32[多进程之Pool+Logging]</title><summary type="text">一 poolmultiprocessing.pool也就是传说中的进程池，pool的构造如下multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]]) 中，processes表示pool中进程的数目，默认地为当前CPU的核数。initializer表示新进程的初始化函数。initargs表示新进程的初始化函数的参数。maxtasksperchild表示每个进程执行task的最大数目。apply()用来为pool中的进程赋予task。map()用来循环地为pool中的进程赋予tasks。clos</summary><published>2012-01-10T08:12:00Z</published><updated>2012-01-10T08:12:00Z</updated><author><name>iTech</name><uri>http://www.cnblogs.com/itech/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itech/archive/2012/01/10/2318178.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itech/archive/2012/01/10/2318178.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;一 pool&lt;/p&gt;&lt;p&gt;multiprocessing.pool也就是传说中的进程池，pool的构造如下&amp;nbsp;&lt;/p&gt;&lt;p&gt;multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]]) 中，&lt;/p&gt;&lt;div&gt;&lt;div&gt;processes表示pool中进程的数目，默认地为当前CPU的核数。&lt;/div&gt;&lt;p&gt;initializer表示新进程的初始化函数。&lt;/p&gt;&lt;p&gt;initargs表示新进程的初始化函数的参数。&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;maxtasksperchild表示每个进程执行task的最大数目。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;apply()用来为pool中的进程赋予task。&lt;/p&gt;&lt;p&gt;map()用来循环地为pool中的进程赋予tasks。&lt;/p&gt;&lt;p&gt;close()用来阻止新的task的提交到pool中，一但已有的tasks都完成后，pool将退出。&lt;/p&gt;&lt;p&gt;terminate()用来立即停止pool中所有的进程。&lt;/p&gt;&lt;p&gt;join()等待pool中所有的进程退出。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;实例：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;multiprocessing&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;time&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;do_calculation(data):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(multiprocessing.current_process().name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(3)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;data&amp;nbsp;*&amp;nbsp;2&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;start_process():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Starting&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,&amp;nbsp;multiprocessing.current_process().name)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__name__&lt;/span&gt;&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;__main__&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inputs&amp;nbsp;=&amp;nbsp;list(range(10))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Input&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;+&amp;nbsp;str(inputs))&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pool_size&amp;nbsp;=&amp;nbsp;multiprocessing.cpu_count()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pool&amp;nbsp;=&amp;nbsp;multiprocessing.Pool(processes=pool_size,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initializer=start_process,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pool_outputs&amp;nbsp;=&amp;nbsp;pool.map(do_calculation,&amp;nbsp;inputs)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pool.close()&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;no&amp;nbsp;more&amp;nbsp;tasks&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pool.join()&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;wrap&amp;nbsp;up&amp;nbsp;current&amp;nbsp;tasks&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Pool&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;+&amp;nbsp;str(pool_outputs))&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;运行结果：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/itech/pythonperl/pythonprocess3.png" width="621" height="443" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;上面的实例中可以看到当前的CPU是8core的，pool中公有8个进程，但是有10个任务，其中有2个进程处理了2个任务。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;二 logging&lt;/p&gt;&lt;p&gt;使用multiprocessing启动的logger来帮助调试多进程。例如：&lt;/p&gt;&lt;div&gt;&lt;div&gt;logger = multiprocessing.log_to_stderr(logging.DEBUG)&lt;/div&gt;&lt;/div&gt;&lt;p&gt;logger.debug("Test")&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;完！&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/itech/aggbug/2318178.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itech/archive/2012/01/10/2318178.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itech/archive/2012/01/10/2318120.html</id><title type="text">python类库32[多进程共享高级之Manager]</title><summary type="text">Python中进程间共享数据，处理基本的queue，pipe和value+array外，还提供了更高层次的封装。使用multiprocessing.Manager可以简单地使用这些高级接口。Manager()返回的manager对象控制了一个server进程，此进程包含的python对象可以被其他的进程通过proxies来访问。从而达到多进程间数据通信且安全。Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array。1） Manager的dic</summary><published>2012-01-10T06:49:00Z</published><updated>2012-01-10T06:49:00Z</updated><author><name>iTech</name><uri>http://www.cnblogs.com/itech/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itech/archive/2012/01/10/2318120.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itech/archive/2012/01/10/2318120.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Python中进程间共享数据，处理基本的queue，pipe和value+array外，还提供了更高层次的封装。使用multiprocessing.Manager可以简单地使用这些高级接口。&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;div&gt;Manager()返回的manager对象控制了一个server进程，此进程包含的python对象可以被其他的进程通过proxies来访问。从而达到多进程间数据通信且安全。&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;1） Manager的dict，list使用&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;multiprocessing&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;time&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;worker(d,&amp;nbsp;key,&amp;nbsp;value):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d[key]&amp;nbsp;=&amp;nbsp;value&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__name__&lt;/span&gt;&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;__main__&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mgr&amp;nbsp;=&amp;nbsp;multiprocessing.Manager()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;=&amp;nbsp;mgr.dict()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jobs&amp;nbsp;=&amp;nbsp;[&amp;nbsp;multiprocessing.Process(target=worker,&amp;nbsp;args=(d,&amp;nbsp;i,&amp;nbsp;i*2))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;range(10)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;j&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;jobs:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j.start()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;j&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;jobs:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j.join()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Results:&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;key,&amp;nbsp;value&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;enumerate(dict(d)):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s=%s&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;%&amp;nbsp;(key,&amp;nbsp;value))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;the&amp;nbsp;output&amp;nbsp;is&amp;nbsp;:&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Results:&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;0=0&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;1=1&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;2=2&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;3=3&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;4=4&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;5=5&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;6=6&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;7=7&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;8=8&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;# 9=9&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;上面为manager.dict的使用实例。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;2）namespace对象没有公共的方法，但是有可写的属性。&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;然而当使用manager返回的namespace的proxy的时候，_属性值属于proxy，跟原来的namespace没有关系。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; manager = multiprocessing.Manager()&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; Global = manager.Namespace()&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; Global.x = 10&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; Global.y = 'hello'&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; Global._z = 12.3 &amp;nbsp; &amp;nbsp;# this is an attribute of the proxy&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;&amp;gt; print(Global)&lt;/div&gt;&lt;/div&gt;Namespace(x=10, y='hello')&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;完！&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/itech/aggbug/2318120.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itech/archive/2012/01/10/2318120.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itech/archive/2012/01/10/2317855.html</id><title type="text">python类库32[多进程同步Lock+Semaphore+Event]</title><summary type="text">同步的方法基本与多线程相同。1) Lock当多个进程需要访问共享资源的时候，Lock可以用来避免访问的冲突。importmultiprocessingimportsysdefworker_with(lock,f):withlock:fs=open(f,&amp;quot;a+&amp;quot;)fs.write(&amp;#39;Lockacquiredviawith\n&amp;#39;)fs.close()defworker_no_with(lock,f):lock.acquire()try:fs=open(f,&amp;quot;a+&amp;quot;)fs.write(&amp;#39;Lockacquireddirectly\n&amp;#3</summary><published>2012-01-10T05:57:00Z</published><updated>2012-01-10T05:57:00Z</updated><author><name>iTech</name><uri>http://www.cnblogs.com/itech/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itech/archive/2012/01/10/2317855.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itech/archive/2012/01/10/2317855.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;同步的方法基本与多线程相同。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;1) Lock&lt;/p&gt;&lt;p&gt;当多个进程需要访问共享资源的时候，Lock可以用来避免访问的冲突。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;import&amp;nbsp;multiprocessing&lt;br /&gt;import&amp;nbsp;sys&lt;br /&gt;&lt;br /&gt;def&amp;nbsp;worker_with(&lt;span style="color: #0000FF;"&gt;lock&lt;/span&gt;,&amp;nbsp;f):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;&lt;span style="color: #0000FF;"&gt;lock&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs&amp;nbsp;=&amp;nbsp;open(f,&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;a+&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.write(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Lock&amp;nbsp;acquired&amp;nbsp;via&amp;nbsp;with\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.close()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;def&amp;nbsp;worker_no_with(&lt;span style="color: #0000FF;"&gt;lock&lt;/span&gt;,&amp;nbsp;f):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;lock&lt;/span&gt;.acquire()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs&amp;nbsp;=&amp;nbsp;open(f,&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;a+&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.write(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Lock&amp;nbsp;acquired&amp;nbsp;directly\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fs.close()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;finally&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;lock&lt;/span&gt;.release()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;__main__&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;file.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;lock&lt;/span&gt;&amp;nbsp;=&amp;nbsp;multiprocessing.Lock()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w&amp;nbsp;=&amp;nbsp;multiprocessing.Process(target=worker_with,&amp;nbsp;args=(&lt;span style="color: #0000FF;"&gt;lock&lt;/span&gt;,&amp;nbsp;f))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nw&amp;nbsp;=&amp;nbsp;multiprocessing.Process(target=worker_no_with,&amp;nbsp;args=(&lt;span style="color: #0000FF;"&gt;lock&lt;/span&gt;,&amp;nbsp;f))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w.start()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nw.start()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w.join()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nw.join()&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;在上面的例子中，如果两个进程没有使用lock来同步,则他们对同一个文件的写操作可能会出现混乱。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;2）Semaphore&lt;/p&gt;&lt;p&gt;Semaphore用来控制对共享资源的访问数量，例如池的最大连接数。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;multiprocessing&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;time&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;worker(s,i):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s.acquire()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(multiprocessing.current_process().name&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;acquire&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(multiprocessing.current_process().name&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;release&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s.release()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__name__&lt;/span&gt;&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;__main__&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&amp;nbsp;=&amp;nbsp;multiprocessing.Semaphore(2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;range(5):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&amp;nbsp;=&amp;nbsp;multiprocessing.Process(target=worker,&amp;nbsp;args=(s,i*2))&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; p.start()&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;上面的实例中使用semaphore限制了最多有2个进程同时执行。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;3）Event&lt;/p&gt;&lt;p&gt;Event用来实现进程间同步通信。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;multiprocessing&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;time&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;wait_for_event(e):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000;"&gt;"""&lt;/span&gt;&lt;span style="color: #800000;"&gt;Wait&amp;nbsp;for&amp;nbsp;the&amp;nbsp;event&amp;nbsp;to&amp;nbsp;be&amp;nbsp;set&amp;nbsp;before&amp;nbsp;doing&amp;nbsp;anything&lt;/span&gt;&lt;span style="color: #800000;"&gt;"""&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;wait_for_event:&amp;nbsp;starting&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.wait()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;wait_for_event:&amp;nbsp;e.is_set()-&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;+&amp;nbsp;str(e.is_set()))&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;wait_for_event_timeout(e,&amp;nbsp;t):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000;"&gt;"""&lt;/span&gt;&lt;span style="color: #800000;"&gt;Wait&amp;nbsp;t&amp;nbsp;seconds&amp;nbsp;and&amp;nbsp;then&amp;nbsp;timeout&lt;/span&gt;&lt;span style="color: #800000;"&gt;"""&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;wait_for_event_timeout:&amp;nbsp;starting&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.wait(t)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;wait_for_event_timeout:&amp;nbsp;e.is_set()-&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;+&amp;nbsp;str(e.is_set()))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__name__&lt;/span&gt;&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;__main__&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e&amp;nbsp;=&amp;nbsp;multiprocessing.Event()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w1&amp;nbsp;=&amp;nbsp;multiprocessing.Process(name=&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;block&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target=wait_for_event,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args=(e,))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w1.start()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w2&amp;nbsp;=&amp;nbsp;multiprocessing.Process(name=&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;non-block&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target=wait_for_event_timeout,&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args=(e,&amp;nbsp;2))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w2.start()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(3)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.set()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;main:&amp;nbsp;event&amp;nbsp;is&amp;nbsp;set&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;the&amp;nbsp;output&amp;nbsp;is:&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;wait_for_event_timeout:&amp;nbsp;starting&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;wait_for_event:&amp;nbsp;starting&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;wait_for_event_timeout:&amp;nbsp;e.is_set()-&amp;gt;False&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;main:&amp;nbsp;event&amp;nbsp;is&amp;nbsp;set&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;wait_for_event:&amp;nbsp;e.is_set()-&amp;gt;True&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;参考：&lt;a href="http://www.doughellmann.com/PyMOTW/multiprocessing/communication.html"&gt;http://www.doughellmann.com/PyMOTW/multiprocessing/communication.html&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;完！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/itech/aggbug/2317855.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itech/archive/2012/01/10/2317855.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itech/archive/2012/01/09/2314942.html</id><title type="text">python类库32[多进程通信Queue+Pipe+Value+Array]</title><summary type="text">多进程通信queue和pipe的区别： pipe用来在两个进程间通信。queue用来在多个进程间实现通信。 此两种方法为所有系统多进程通信的基本方法，几乎所有的语言都支持此两种方法。1）Queue &amp;amp; JoinableQueuequeue用来在进程间传递消息，任何可以pickle-able的对象都可以在加入到queue。multiprocessing.JoinableQueue 是 Queue的子类，增加了task_done()和join()方法。task_done()用来告诉queue一个task完成。一般地在调用get()获得一个task，在task结束后调用task_done()</summary><published>2012-01-09T08:38:00Z</published><updated>2012-01-09T08:38:00Z</updated><author><name>iTech</name><uri>http://www.cnblogs.com/itech/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itech/archive/2012/01/09/2314942.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itech/archive/2012/01/09/2314942.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;多进程通信&lt;/p&gt;&lt;p&gt;queue和pipe的区别： pipe用来在两个进程间通信。queue用来在多个进程间实现通信。 此两种方法为所有系统多进程通信的基本方法，几乎所有的语言都支持此两种方法。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;1）Queue &amp;amp; JoinableQueue&lt;/p&gt;&lt;p&gt;queue用来在进程间传递消息，任何可以pickle-able的对象都可以在加入到queue。&amp;nbsp;&lt;/p&gt;&lt;p&gt;multiprocessing.JoinableQueue 是 Queue的子类，增加了task_done()和join()方法。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;task_done()用来告诉queue一个task完成。一般地在调用get()获得一个task，在task结束后调用task_done()来通知Queue当前task完成。&lt;/p&gt;&lt;p&gt;join() 阻塞直到queue中的所有的task都被处理（即task_done方法被调用）。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;multiprocessing&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;time&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;Consumer(multiprocessing.Process):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__init__&lt;/span&gt;(self,&amp;nbsp;task_queue,&amp;nbsp;result_queue):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;multiprocessing.Process.&lt;span style="color: #800080;"&gt;__init__&lt;/span&gt;(self)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.task_queue&amp;nbsp;=&amp;nbsp;task_queue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.result_queue&amp;nbsp;=&amp;nbsp;result_queue&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;run(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proc_name&amp;nbsp;=&amp;nbsp;self.name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&amp;nbsp;True:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next_task&amp;nbsp;=&amp;nbsp;self.task_queue.get()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;next_task&amp;nbsp;&lt;span style="color: #0000FF;"&gt;is&lt;/span&gt;&amp;nbsp;None:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Poison&amp;nbsp;pill&amp;nbsp;means&amp;nbsp;shutdown&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s:&amp;nbsp;Exiting&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;%&amp;nbsp;proc_name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.task_queue.task_done()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;break&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s:&amp;nbsp;%s&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;%&amp;nbsp;(proc_name,&amp;nbsp;next_task))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer&amp;nbsp;=&amp;nbsp;next_task()&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;__call__()&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.task_queue.task_done()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.result_queue.put(answer)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;Task(object):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__init__&lt;/span&gt;(self,&amp;nbsp;a,&amp;nbsp;b):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.a&amp;nbsp;=&amp;nbsp;a&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.b&amp;nbsp;=&amp;nbsp;b&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__call__&lt;/span&gt;(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(0.1)&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;pretend&amp;nbsp;to&amp;nbsp;take&amp;nbsp;some&amp;nbsp;time&amp;nbsp;to&amp;nbsp;do&amp;nbsp;the&amp;nbsp;work&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s&amp;nbsp;*&amp;nbsp;%s&amp;nbsp;=&amp;nbsp;%s&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;%&amp;nbsp;(self.a,&amp;nbsp;self.b,&amp;nbsp;self.a&amp;nbsp;*&amp;nbsp;self.b)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__str__&lt;/span&gt;(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s&amp;nbsp;*&amp;nbsp;%s&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;%&amp;nbsp;(self.a,&amp;nbsp;self.b)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__name__&lt;/span&gt;&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;__main__&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Establish&amp;nbsp;communication&amp;nbsp;queues&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tasks&amp;nbsp;=&amp;nbsp;multiprocessing.JoinableQueue()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;results&amp;nbsp;=&amp;nbsp;multiprocessing.Queue()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Start&amp;nbsp;consumers&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num_consumers&amp;nbsp;=&amp;nbsp;multiprocessing.cpu_count()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Creating&amp;nbsp;%d&amp;nbsp;consumers&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;%&amp;nbsp;num_consumers)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;consumers&amp;nbsp;=&amp;nbsp;[&amp;nbsp;Consumer(tasks,&amp;nbsp;results)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;range(num_consumers)&amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;w&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;consumers:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w.start()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Enqueue&amp;nbsp;jobs&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num_jobs&amp;nbsp;=&amp;nbsp;10&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;range(num_jobs):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tasks.put(Task(i,&amp;nbsp;i))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Add&amp;nbsp;a&amp;nbsp;poison&amp;nbsp;pill&amp;nbsp;for&amp;nbsp;each&amp;nbsp;consumer&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;range(num_consumers):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tasks.put(None)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Wait&amp;nbsp;for&amp;nbsp;all&amp;nbsp;of&amp;nbsp;the&amp;nbsp;tasks&amp;nbsp;to&amp;nbsp;finish&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tasks.join()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Start&amp;nbsp;printing&amp;nbsp;results&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&amp;nbsp;num_jobs:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;results.get()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Result:&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,&amp;nbsp;result)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num_jobs&amp;nbsp;-=&amp;nbsp;1&lt;/div&gt;&lt;/div&gt;&lt;p&gt;注意小技巧： 使用None来表示task处理完毕。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;运行结果：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/itech/pythonperl/pythonprocess2.png" width="533" height="587" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;2） pipe&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;pipe()返回一对连接对象，代表了pipe的两端。每个对象都有send()和recv()方法。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;代码：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;from&lt;/span&gt;&amp;nbsp;multiprocessing&amp;nbsp;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;Process,&amp;nbsp;Pipe&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;f(conn):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.send([42,&amp;nbsp;None,&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;hello&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.close()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__name__&lt;/span&gt;&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;__main__&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parent_conn,&amp;nbsp;child_conn&amp;nbsp;=&amp;nbsp;Pipe()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&amp;nbsp;=&amp;nbsp;Process(target=f,&amp;nbsp;args=(child_conn,))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p.start()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p.join()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(parent_conn.recv())&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;prints&amp;nbsp;"[42,&amp;nbsp;None,&amp;nbsp;'hello']"&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;3）Value + Array&lt;/p&gt;&lt;p&gt;Value + Array 是python中共享内存 映射文件的方法，速度比较快。&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;from&lt;/span&gt;&amp;nbsp;multiprocessing&amp;nbsp;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;Process,&amp;nbsp;Value,&amp;nbsp;Array&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;f(n,&amp;nbsp;a):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n.value&amp;nbsp;=&amp;nbsp;n.value&amp;nbsp;+&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;range(len(a)):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a[i]&amp;nbsp;=&amp;nbsp;a[i]&amp;nbsp;*&amp;nbsp;10&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__name__&lt;/span&gt;&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;__main__&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num&amp;nbsp;=&amp;nbsp;Value(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;i&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,&amp;nbsp;1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arr&amp;nbsp;=&amp;nbsp;Array(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;i&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,&amp;nbsp;range(10))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&amp;nbsp;=&amp;nbsp;Process(target=f,&amp;nbsp;args=(num,&amp;nbsp;arr))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p.start()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p.join()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(num.value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(arr[:])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p2&amp;nbsp;=&amp;nbsp;Process(target=f,&amp;nbsp;args=(num,&amp;nbsp;arr))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p2.start()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p2.join()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(num.value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(arr[:])&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;the&amp;nbsp;output&amp;nbsp;is&amp;nbsp;:&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;2&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;[0,&amp;nbsp;10,&amp;nbsp;20,&amp;nbsp;30,&amp;nbsp;40,&amp;nbsp;50,&amp;nbsp;60,&amp;nbsp;70,&amp;nbsp;80,&amp;nbsp;90]&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;3&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;[0,&amp;nbsp;100,&amp;nbsp;200,&amp;nbsp;300,&amp;nbsp;400,&amp;nbsp;500,&amp;nbsp;600,&amp;nbsp;700,&amp;nbsp;800,&amp;nbsp;900]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;参考： &lt;br /&gt;The Python Standard Library By Example&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.doughellmann.com/PyMOTW/multiprocessing/communication.html"&gt;http://www.doughellmann.com/PyMOTW/multiprocessing/communication.html&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;完！&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/itech/aggbug/2314942.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itech/archive/2012/01/09/2314942.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itech/archive/2012/01/06/2314680.html</id><title type="text">python类库32[多进程]</title><summary type="text">由于CPython实现中的GIL的限制，python中的多线程其实并不是真正的多线程，如果想要充分地使用多核CPU的资源，在python中大部分情况我们需要使用多进程。 这也许就是python中多进程类库如此简洁好用的原因所在。在python中可以向多线程一样简单地使用多进程。一 多进程process的成员变量和方法：&amp;gt;&amp;gt;class multiprocessing.Process([group[, target[, name[, args[, kwargs]]]]]) 来的定义类似于threading.Thread。target表示此进程运行的函数，args和kwargs表示tar</summary><published>2012-01-06T08:53:00Z</published><updated>2012-01-06T08:53:00Z</updated><author><name>iTech</name><uri>http://www.cnblogs.com/itech/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itech/archive/2012/01/06/2314680.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itech/archive/2012/01/06/2314680.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;由于CPython实现中的GIL的限制，python中的多线程其实并不是真正的多线程，如果想要充分地使用多核CPU的资源，在python中大部分情况我们需要使用多进程。 这也许就是python中多进程类库如此简洁好用的原因所在。在python中可以向多线程一样简单地使用多进程。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;一 多进程&amp;nbsp;&lt;/p&gt;&lt;p&gt;process的成员变量和方法：&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&amp;gt;&amp;gt;class multiprocessing.Process([group[, target[, name[, args[, kwargs]]]]]) 来的定义类似于threading.Thread。target表示此进程运行的函数，args和kwargs表示target的参数。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;gt;&amp;gt;name, pid &lt;/p&gt;&lt;p&gt;分别表示进程的名字，进程id。&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&amp;gt;&amp;gt; daemon成员&lt;/div&gt;&lt;p&gt;daemon标志位bool变量，需要在start()调用前设置。daemon的初始值是从父进程继承而来。当一个进程结束的时候，它尝试去结束它的所有的daemon子进程。&lt;/p&gt;&lt;/div&gt;&lt;p&gt;注意：&amp;nbsp;&lt;/p&gt;&lt;p&gt;daemon进程不允许创建子进程。否则当daemon进程结束的时候它的子进程不能被结束。&lt;/p&gt;&lt;p&gt;这里的daemon不是Unix的daemon进程，当父进程结束的时候所有的daemon子进程也将被终止（对于非daemon进程，父进程不等待非daemon的紫子进程，除非显示地对非daemon子进程使用join()方法）。&lt;/p&gt;&lt;div&gt;&lt;p&gt;&amp;gt;&amp;gt; &amp;nbsp;exitcode&lt;/p&gt;&lt;/div&gt;&lt;p&gt;如果进程还没有退出，则为None，如果正确的退出则为0，如果有错误则为&amp;gt;0的错误代码，如果进程为终止则为-1*singal。&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;gt;&amp;gt; start(), is_live(), terminate()&lt;/p&gt;&lt;p&gt;start()用来启动进程，is_live()用来查看进程的状态，terminate()用来终止进程。&lt;/p&gt;&lt;p&gt;&amp;gt;&amp;gt; run() &lt;/p&gt;&lt;p&gt;可以在process的子类中重载run()方法，从而设定进程的任务。重载process是构造新进程的另一种方式，一定程度上上等价于process的target参数。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;multiprcessing的静态方法：&lt;/p&gt;&lt;p&gt;&amp;gt;&amp;gt; &amp;nbsp;multiprocessing.cpu_count()&lt;/p&gt;&lt;p&gt;用来获得当前的CPU的核数，可以用来设置接下来子进程的个数。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;gt;&amp;gt; &amp;nbsp;multiprocessing.active_children()&lt;/p&gt;&lt;p&gt;用来获得当前所有的子进程，包括daemon和非daemon子进程。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;实例：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;multiprocessing&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;time&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;sys&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;worker(num):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&amp;nbsp;=&amp;nbsp;multiprocessing.current_process()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Starting:&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;+&amp;nbsp;p.name&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;str(p.pid))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(str(num))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sys.stdout.flush()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Exiting&amp;nbsp;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;+&amp;nbsp;p.name&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;str(p.pid))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sys.stdout.flush()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;daemon():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&amp;nbsp;=&amp;nbsp;multiprocessing.current_process()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Starting:&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;+&amp;nbsp;p.name&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;str(p.pid))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sys.stdout.flush()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(10)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Exiting&amp;nbsp;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;+&amp;nbsp;p.name&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;str(p.pid))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sys.stdout.flush()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;non_daemon():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&amp;nbsp;=&amp;nbsp;multiprocessing.current_process()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Starting:&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;+&amp;nbsp;p.name&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;str(p.pid))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sys.stdout.flush()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(20)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Exiting&amp;nbsp;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;+&amp;nbsp;p.name&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;str(p.pid))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sys.stdout.flush()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;__name__&lt;/span&gt;&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;__main__&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w&amp;nbsp;=&amp;nbsp;multiprocessing.Process(name=&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;worker&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,&amp;nbsp;target=worker,&amp;nbsp;args=(100,))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;=&amp;nbsp;multiprocessing.Process(name=&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;daemon&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,&amp;nbsp;target=daemon)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d.daemon&amp;nbsp;=&amp;nbsp;True&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nd&amp;nbsp;=&amp;nbsp;multiprocessing.Process(name=&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;non-daemon&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,&amp;nbsp;target=non_daemon)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w.start()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d.start()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nd.start()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;the&amp;nbsp;number&amp;nbsp;of&amp;nbsp;CPU&amp;nbsp;is&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;str(multiprocessing.cpu_count()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;All&amp;nbsp;children&amp;nbsp;processes:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;p&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;multiprocessing.active_children():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;child:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;p.name&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;str(p.pid))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w.join()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;d.join()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;运行结果：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/itech/pythonperl/pythonprocess1.png" width="437" height="363" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;可以从上面的例子看到没有多非daemon子进程使用join()方法，结果父进程没有等待非daemon进程结束就退出了。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;完！&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/itech/aggbug/2314680.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itech/archive/2012/01/06/2314680.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itech/archive/2012/01/06/2314454.html</id><title type="text">Python转载[编码规范]</title><summary type="text">转自：http://blog.csdn.net/lanphaday/article/details/6601123但是有些如果与python自带的类库有冲突的做了适当的修改。1 编码&amp;gt;&amp;gt;所有的 Python 脚本文件都应在文件头标上如下标识或其兼容格式的标识：# -*- coding:utf-8 -*- &amp;gt;&amp;gt;设置编辑器，默认新建或保存为utf-8格式。2 注释&amp;gt;&amp;gt;业界普遍认同 Python 的注释分为两种的概念，一种是由 # 开头的“真正的”注释，另一种是 docstrings。前者表明为何选择当前实现以及这种实现的原理和难点，后者表明如何使用这个包、模块、</summary><published>2012-01-06T06:49:00Z</published><updated>2012-01-06T06:49:00Z</updated><author><name>iTech</name><uri>http://www.cnblogs.com/itech/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itech/archive/2012/01/06/2314454.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itech/archive/2012/01/06/2314454.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;转自：http://blog.csdn.net/lanphaday/article/details/6601123&amp;nbsp;&lt;/div&gt;&lt;p&gt;但是有些如果与python自带的类库有冲突的做了适当的修改。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;1 编码&lt;/p&gt;&lt;div&gt;&amp;gt;&amp;gt;所有的 Python 脚本文件都应在文件头标上如下标识或其兼容格式的标识：&amp;nbsp;&lt;/div&gt;&lt;div&gt;# -*- coding:utf-8 -*- &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;设置编辑器，默认新建或保存为utf-8格式。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;2 注释&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;业界普遍认同 Python 的注释分为两种的概念，一种是由 # 开头的&amp;#8220;真正的&amp;#8221;注释，另一种是 docstrings。前者表明为何选择当前实现以及这种实现的原理和难点，后者表明如何使用这个包、模块、类、函数（方法），甚至包括使用示例和单元测试。&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;坚持适当注释原则。对不存在技术难点的代码坚持不注释，对存在技术难点的代码必须注释。但与注释不同，推荐对每一个包、模块、类、函数（方法）写 docstrings，除非代码一目了然，非常简单。&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;3 格式缩进&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;Python依赖缩进来确定代码块的层次，行首空白符主要有两种：tab 和空格，但严禁两者混用。&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;使用4个空格的tab进行缩进，保持与python类库一致。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;4 空格&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;空格在Python代码中是有意义的，因为Python的语法依赖于缩进，在行首的空格称为前导空格。在这一节不讨论前导空格相关的内容，只讨论非前导空格。非前导空格在 Python 代码中没有意义，但适当地加入非前导空格可以增进代码的可读性。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;在二元算术、逻辑运算符前后加空格，如：&lt;/div&gt;&lt;div&gt;a = b + c &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt; &amp;#8220;:&amp;#8221;用在行尾时前后皆不加空格，如分枝、循环、函数和类定义语言；用在非行尾时两端加空格，如 dict 对象的定义：&lt;/div&gt;&lt;div&gt;d = {'key' : 'value'} &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;括号（含圆括号、方括号和花括号）前后不加空格，如：&lt;/div&gt;&lt;div&gt;do_something(arg1, arg2) &amp;nbsp;&lt;/div&gt;&lt;div&gt;而不是&lt;/div&gt;&lt;div&gt;do_something( arg1, arg2 ) &amp;nbsp;&lt;/div&gt;&lt;div&gt;逗号后面加一个空格，前面不加空格；&lt;/div&gt;&lt;p&gt;&amp;gt;&amp;gt;函数中命名参数中的=前后不需要加空格，例如：&lt;br /&gt;def parse(fp=None, environ=os.environ, keep_blank_values=0, strict_parsing=0):&amp;nbsp;pass&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;5 空行&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;适当的空行有利于增加代码的可读性，加空行可以参考如下几个准则：&lt;/div&gt;&lt;div&gt;在类、函数的定义间加空行；&lt;/div&gt;&lt;div&gt;在import不同种类的模块间加空行；&lt;/div&gt;&lt;div&gt;在函数中的逻辑段落间加空行，即把相关的代码紧凑写在一起，作为一个逻辑段落，段落间以空行分隔；&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;6 断行&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;尽管现在的宽屏显示器已经可以单屏显示超过 256 列字符，但本规范仍然坚持行的最大长度不得超过78个字符的标准(我觉的notepad++默认值为100比较合适)。折叠长行的方法有以下几种方法：&lt;/div&gt;&lt;div&gt;为长变量名换一个短名，如：&lt;/div&gt;&lt;div&gt;this._is.a.very.long.variable_name = this._is.another.long.variable_name &amp;nbsp;&lt;/div&gt;&lt;div&gt;应改为：&lt;/div&gt;&lt;div&gt;variable_name1 = this._is.a.very.long.variable_name &amp;nbsp;&lt;/div&gt;&lt;div&gt;variable_name2 = this._is.another.variable_name &amp;nbsp;&lt;/div&gt;&lt;div&gt;variable_name1 = variable_name2&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;在括号（包括圆括号、方括号和花括号）内换行，如：&lt;/div&gt;&lt;div&gt;class Edit(Widget): &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; def __init__(self, parent, width, &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; font = FONT, color = BLACK, pos = POS, style = 0): # 注意：多一层缩进 &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; pass &amp;nbsp;&lt;/div&gt;&lt;div&gt;或：&lt;/div&gt;&lt;div&gt;very_very_very_long_variable_name = Edit(parent, &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; width, &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; font, &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; color, &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; pos) # 注意：多一层缩进 &amp;nbsp;&lt;/div&gt;&lt;div&gt;do_sth_with(very_very_very_long_variable_name) &amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;如果行长到连第一个括号内的参数都放不下，则每个元素都单独占一行：&lt;/div&gt;&lt;div&gt;very_very_very_long_variable_name = ui.widgets.Edit( &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; panrent, &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; width, &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; font, &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; color, &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; pos) # 注意：多一层缩进 &amp;nbsp;&lt;/div&gt;&lt;div&gt;do_sth_with(very_very_very_long_variable_name) &amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;在长行加入续行符强行断行，断行的位置应在操作符前，且换行后多一个缩进，以使维护人员看代码的时候看到代码行首即可判定这里存在换行，如：&lt;/div&gt;&lt;div&gt;if color == WHITE or color == BLACK \ &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; or color == BLUE: # 注意 or 操作符在新行的行首而不是旧行的行尾，上一行的续行符不可省略 &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; do_something(color); &amp;nbsp;&lt;/div&gt;&lt;div&gt;else: &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; do_something(DEFAULT_COLOR); &amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;7 命名&lt;/div&gt;&lt;div&gt;一致的命名可以给开发人员减少许多麻烦，而恰如其分的命名则可以大幅提高代码的可读性，降低维护成本。&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;常量&lt;/div&gt;&lt;div&gt;常量名所有字母大写，由下划线连接各个单词，如：&lt;/div&gt;&lt;div&gt;WHITE = 0xffffffff &amp;nbsp;&lt;/div&gt;&lt;div&gt;THIS_IS_A_CONSTANT = 1 &amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&amp;gt;&amp;gt;变量&lt;/div&gt;&lt;div&gt;变量名全部小写，由下划线连接各个单词，如：&lt;/div&gt;&lt;div&gt;color = WHITE &amp;nbsp;&lt;/div&gt;&lt;div&gt;this_is_a_variable = 1 &amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;不论是类成员变量还是全局变量，均不使用 m 或 g 前缀。私有类成员使用单一下划线前缀标识，多定义公开成员，少定义私有成员。&lt;/div&gt;&lt;div&gt;变量名不应带有类型信息，因为 Python 是动态类型语言。如 iValue、names_list、dict_obj 等都是不好的命名。&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&amp;gt;&amp;gt;函数&lt;/div&gt;&lt;div&gt;函数名的命名规则与变量名相同。&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&amp;gt;&amp;gt;类&lt;/div&gt;&lt;div&gt;类名单词首字母大写，不使用下划线连接单词，也不加入 C、T 等前缀。如：&lt;/div&gt;&lt;div&gt;class ThisIsAClass(object): &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; passs &amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&amp;gt;&amp;gt;模块&lt;/div&gt;&lt;div&gt;模块名全部小写，对于包内使用的模块，可以加一个下划线前缀，如：&lt;/div&gt;&lt;div&gt;module.py &amp;nbsp;&lt;/div&gt;&lt;div&gt;_internal_module.py &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;gt;&amp;gt;包&lt;/p&gt;&lt;div&gt;包的命名规范与模块相同。&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;8 缩写&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;命名应当尽量使用全拼写的单词，缩写的情况有如下两种：&lt;/div&gt;&lt;div&gt;常用的缩写，如 XML、ID等，在命名时也应只大写首字母，如：&lt;/div&gt;&lt;div&gt;class XmlParser(object):pass &amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&amp;gt;&amp;gt;命名中含有长单词，对某个单词进行缩写。这时应使用约定成俗的缩写方式，如去除元音、包含辅音的首字符等方式，例如：&lt;/div&gt;&lt;div&gt;function 缩写为 fn&lt;/div&gt;&lt;div&gt;text 缩写为 txt&lt;/div&gt;&lt;div&gt;object 缩写为 obj&lt;/div&gt;&lt;div&gt;count 缩写为 cnt&lt;/div&gt;&lt;div&gt;number 缩写为 num，等。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&amp;gt;&amp;gt;特定命名方式&lt;/div&gt;&lt;div&gt;主要是指 __xxx__ 形式的系统保留字命名法。项目中也可以使用这种命名，它的意义在于这种形式的变量是只读的，这种形式的类成员函数一般都有特定的含义，自定义时需要确保不要与系统的冲突，只有在确实需要的时候才重载系统保留的这些函数。如：&lt;/div&gt;&lt;div&gt;class Base(object): &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; def __init__(self, id, parent = None): &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; self.__id__ = id &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; self.__parent__ = parent &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; def __message__(self, msgid): &amp;nbsp;pass&lt;/div&gt;&lt;div&gt;其中 __id__、__parent__ 和 __message__ 都采用了系统保留字命名法。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;9 语句&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;import&lt;/div&gt;&lt;div&gt;import 语句有以下几个原则需要遵守：&lt;/div&gt;&lt;div&gt;import 的次序，先import Python 内置模块，再import第三方模块，最后import自己开发的项目中的其它模块；这几种模块中用空行分隔开来。&lt;/div&gt;&lt;div&gt;一条import语句import一个模块。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;当从模块中import多个对象且超过一行时，使用如下断行法（此语法 py2.5 以上版本才支持）：&lt;/div&gt;&lt;div&gt;from module import (obj1, obj2, obj3, obj4, &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; obj5, obj6) &amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;不要使用 from module import *，除非是import常量定义模块或其它你确保不会出现命名空间冲突的模块。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;赋值&lt;/div&gt;&lt;div&gt;对于赋值语句，主要是不要做无谓的对齐，如：&lt;/div&gt;&lt;div&gt;a &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= 1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 这是一个行注释 &amp;nbsp;&lt;/div&gt;&lt;div&gt;variable = 2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 另一个行注释 &amp;nbsp;&lt;/div&gt;&lt;div&gt;fn &amp;nbsp; &amp;nbsp; &amp;nbsp; = callback_function &amp;nbsp;# 还是行注释 &amp;nbsp;&lt;/div&gt;&lt;div&gt;没有必要做这种对齐，原因有两点：&lt;/div&gt;&lt;p&gt;一是这种对齐会打乱编程时的注意力，大脑要同时处理两件事（编程和对齐）；&lt;/p&gt;&lt;p&gt;二是以后阅读和维护都很困难，因为人眼的横向视野很窄，把三个字段看成一行很困难，而且维护时要增加一个更长的变量名也会破坏对齐。&lt;/p&gt;&lt;p&gt;直接这样写为佳：&lt;/p&gt;&lt;div&gt;a = 1 # 这是一个行注释 &amp;nbsp;&lt;/div&gt;&lt;div&gt;variable = 2 # 另一个行注释 &amp;nbsp;&lt;/div&gt;&lt;div&gt;fn = callback_function # 还是行注释&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;分支和循环&lt;/div&gt;&lt;div&gt;对于分支和循环，有如下几点需要注意的：&lt;/div&gt;&lt;div&gt;不要写成一行，如：&lt;/div&gt;&lt;div&gt;if not flg: pass &amp;nbsp;&lt;/div&gt;&lt;div&gt;和&lt;/div&gt;&lt;div&gt;for i in xrange(10): print i &amp;nbsp;&lt;/div&gt;&lt;div&gt;都不是好代码，应写成&lt;/div&gt;&lt;div&gt;if not flg: &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; pass &amp;nbsp;&lt;/div&gt;&lt;div&gt;for i in xrange(10): &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; print i &amp;nbsp;&lt;/div&gt;&lt;div&gt;注：本文档中出现写成一行的例子是因为排版的原因，不得作为编码中不断行的依据。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;gt;&amp;gt;条件表达式的编写应该足够 pythonic，如以下形式的条件表达式是拙劣的：&lt;/div&gt;&lt;div&gt;if not len(alist) == 0: do_something() &amp;nbsp;&lt;/div&gt;&lt;div&gt;if not alist == []: do_something() &amp;nbsp;&lt;/div&gt;&lt;div&gt;if not s == "": do_something() &amp;nbsp;&lt;/div&gt;&lt;div&gt;if not var == None: do_something() &amp;nbsp;&lt;/div&gt;&lt;div&gt;if not var == False: do_something() &amp;nbsp;&lt;/div&gt;&lt;div&gt;因为python中None，0，''，[]等默认为False，上面的语句应该写成：&lt;/div&gt;&lt;div&gt;if seq: do_somethin() # 注意，这里命名也更改了 &amp;nbsp;&lt;/div&gt;&lt;div&gt;if var: do_something() &amp;nbsp;&lt;/div&gt;&lt;div&gt;用得着的时候多使用循环语句的 else 分句，以简化代码。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;完！&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/itech/aggbug/2314454.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itech/archive/2012/01/06/2314454.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itech/archive/2012/01/05/2312831.html</id><title type="text">python类库32[多线程同步Lock+RLock+Semaphore+Event]</title><summary type="text">多线程基础：python类库32[多线程同步]一 多线程同步由于CPython的python解释器在单线程模式下执行，所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的资源。大部分情况都推荐使用多进程。python的多线程的同步与其他语言基本相同，主要包含：Lock &amp;amp; RLock ：用来确保多线程多共享资源的访问。Semaphore ： 用来确保一定资源多线程访问时的上限，例如资源池。Event : 是最简单的线程间通信的方式，一个线程可以发送信号，其他的线程接收到信号后执行操作。 二 实例1）Lock &amp;amp; RLockLock对象的状态可以为locked和u</summary><published>2012-01-05T10:29:00Z</published><updated>2012-01-05T10:29:00Z</updated><author><name>iTech</name><uri>http://www.cnblogs.com/itech/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itech/archive/2012/01/05/2312831.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itech/archive/2012/01/05/2312831.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&lt;p&gt;多线程基础：&lt;a href="http://www.cnblogs.com/itech/archive/2012/01/05/2312831.html" style="color: #001e6a; background: inherit; background: inherit; background-color: #ffffff; font-size: 12px; font-family: Verdana; line-height: normal; text-align: left; "&gt;python类库32[多线程同步]&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;一 多线程同步&lt;/p&gt;&lt;p&gt;由于CPython的python解释器在单线程模式下执行，所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的资源。大部分情况都推荐使用多进程。&lt;/p&gt;&lt;p&gt;python的多线程的同步与其他语言基本相同，主要包含：&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Lock &amp;amp; RLock ：用来确保多线程多共享资源的访问。&lt;/p&gt;&lt;p&gt;Semaphore ： 用来确保一定资源多线程访问时的上限，例如资源池。&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;div&gt;Event : 是最简单的线程间通信的方式，一个线程可以发送信号，其他的线程接收到信号后执行操作。 &amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;二 实例&lt;/p&gt;&lt;p&gt;1）Lock &amp;amp; RLock&lt;/p&gt;&lt;p&gt;Lock对象的状态可以为locked和unlocked，&lt;br /&gt;使用acquire()设置为locked状态；&lt;br /&gt;使用release()设置为unlocked状态。&lt;/p&gt;&lt;p&gt;如果当前的状态为unlocked，则acquire()会将状态改为locked然后立即返回。当状态为locked的时候，acquire()将被阻塞直到另一个线程中调用release()来将状态改为unlocked，然后acquire()才可以再次将状态置为locked。&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;Lock.acquire(blocking=True, timeout=-1),blocking参数表示是否阻塞当前线程等待，timeout表示阻塞时的等待时间 。如果成功地获得lock，则acquire()函数返回True，否则返回False，timeout超时时如果还没有获得lock仍然返回False。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;实例：(确保只有一个线程可以访问共享资源)&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;threading&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;time&lt;br /&gt;&amp;nbsp;&lt;br /&gt;num&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;lock&amp;nbsp;=&amp;nbsp;threading.Lock()&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;func(st):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;global&lt;/span&gt;&amp;nbsp;num&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(threading.currentThread().getName()&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;try&amp;nbsp;to&amp;nbsp;acquire&amp;nbsp;the&amp;nbsp;lock&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;lock.acquire():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(threading.currentThread().getName()&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;acquire&amp;nbsp;the&amp;nbsp;lock.&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(threading.currentThread().getName()&amp;nbsp;+&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;:%s&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;%&amp;nbsp;str(num)&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num&amp;nbsp;+=&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(st)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(threading.currentThread().getName()&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;release&amp;nbsp;the&amp;nbsp;lock.&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&amp;nbsp;&amp;nbsp;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lock.release()&lt;br /&gt;&amp;nbsp;&lt;br /&gt;t1&amp;nbsp;=&amp;nbsp;threading.Thread(target=func,&amp;nbsp;args=(8,))&lt;br /&gt;t2&amp;nbsp;=&amp;nbsp;threading.Thread(target=func,&amp;nbsp;args=(4,))&lt;br /&gt;t3&amp;nbsp;=&amp;nbsp;threading.Thread(target=func,&amp;nbsp;args=(2,))&lt;br /&gt;t1.start()&lt;br /&gt;t2.start()&lt;br /&gt;t3.start()&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;结果：&lt;br /&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/itech/pythonperl/pythonthread3.png" width="533" height="315" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;RLock与Lock的区别是：RLock中除了状态locked和unlocked外还记录了当前lock的owner和递归层数，使得RLock可以被同一个线程多次acquire()。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;2）Semaphore&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;div&gt;Semaphore管理一个内置的计数器，&lt;/div&gt;&lt;div&gt;每当调用acquire()时内置计数器-1；&lt;/div&gt;&lt;div&gt;调用release() 时内置计数器+1；&lt;/div&gt;&lt;/div&gt;&lt;p&gt;计数器不能小于0；当计数器为0时，acquire()将阻塞线程直到其他线程调用release()。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;实例：(同时只有2个线程可以获得semaphore,即可以限制最大连接数为2)：&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;threading&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;time&amp;nbsp;&lt;br /&gt;&lt;br /&gt;semaphore&amp;nbsp;=&amp;nbsp;threading.Semaphore(2)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;func():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;semaphore.acquire():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;range(5):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(threading.currentThread().getName()&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;get&amp;nbsp;semaphore&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;semaphore.release()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt;&amp;nbsp;(threading.currentThread().getName()&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;nbsp;release&amp;nbsp;semaphore&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;range(4):&lt;br /&gt;&amp;nbsp;&amp;nbsp;t1&amp;nbsp;=&amp;nbsp;threading.Thread(target=func)&lt;br /&gt;&amp;nbsp;&amp;nbsp;t1.start()&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;结果：&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/itech/pythonperl/pythonthread4.png" width="533" height="523" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;3) Event&amp;nbsp;&lt;/p&gt;&lt;p&gt;Event内部包含了一个标志位，初始的时候为false。&lt;br /&gt;可以使用使用set()来将其设置为true；&lt;br /&gt;或者使用clear()将其从新设置为false；&lt;br /&gt;可以使用is_set()来检查标志位的状态；&lt;br /&gt;另一个最重要的函数就是wait(timeout=None)，用来阻塞当前线程，直到event的内部标志位被设置为true或者timeout超时。如果内部标志位为true则wait()函数理解返回。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;实例： (线程间相互通信)&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;logging&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;threading&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&amp;nbsp;time&lt;br /&gt;&lt;br /&gt;logging.basicConfig(level=logging.DEBUG,&lt;br /&gt;format=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;(%(threadName)-10s&amp;nbsp;:&amp;nbsp;%(message)s&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;def&lt;/span&gt;&amp;nbsp;wait_for_event_timeout(e,&amp;nbsp;t):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000;"&gt;"""&lt;/span&gt;&lt;span style="color: #800000;"&gt;Wait&amp;nbsp;t&amp;nbsp;seconds&amp;nbsp;and&amp;nbsp;then&amp;nbsp;timeout&lt;/span&gt;&lt;span style="color: #800000;"&gt;"""&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;not&lt;/span&gt;&amp;nbsp;e.isSet():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logging.debug(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;wait_for_event_timeout&amp;nbsp;starting&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;event_is_set&amp;nbsp;=&amp;nbsp;e.wait(t)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logging.debug(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;event&amp;nbsp;set:&amp;nbsp;%s&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;%&amp;nbsp;event_is_set)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;event_is_set:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logging.debug(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;processing&amp;nbsp;event&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logging.debug(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;doing&amp;nbsp;other&amp;nbsp;work&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;e&amp;nbsp;=&amp;nbsp;threading.Event()&lt;br /&gt;t2&amp;nbsp;=&amp;nbsp;threading.Thread(name=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;nonblock&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;target=wait_for_event_timeout,args=(e,&amp;nbsp;2))&lt;br /&gt;t2.start()&lt;br /&gt;logging.debug(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Waiting&amp;nbsp;before&amp;nbsp;calling&amp;nbsp;Event.set()&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;br /&gt;time.sleep(7)&lt;br /&gt;e.set()&lt;br /&gt;logging.debug(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Event&amp;nbsp;is&amp;nbsp;set&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;运行结果：&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/itech/pythonperl/pythonthread2.png" width="533" height="315" alt="" style="border-width: initial; border-color: initial; " /&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;三 其他&lt;/p&gt;&lt;p&gt;1）&amp;nbsp;线程局部变量&lt;/p&gt;&lt;div&gt;&lt;div&gt;线程局部变量的值是跟线程相关的，区别与全局的变量。使用非常简单如下：&lt;/div&gt;&lt;div&gt;mydata = threading.local()&lt;/div&gt;&lt;div&gt;mydata.x = 1&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;2）对Lock，semaphore，condition等使用with关键字代替手动调用acquire()和release()。&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;完！&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/itech/aggbug/2312831.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itech/archive/2012/01/05/2312831.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
