注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

江志祥的博客

可恶的中国银行,信用卡像病毒啊,取消那么难,,,

 
 
 

日志

 
 

python多线程学习(三)  

2012-06-19 14:04:59|  分类: 计算机-Python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

2,  同步队列

Python中的Queue对象也提供了对线程同步的支持。使用Queue对象可以实现多个生产者和多个消费者形成的FIFO的队列。

生产者将数据依次存入队列,消费者依次从队列中取出数据。

 

 

  1. # producer_consumer_queue  
  2.   
  3. from Queue import Queue  
  4.   
  5. import random  
  6.   
  7. import threading  
  8.   
  9. import time  
  10.   
  11.    
  12.   
  13. #Producer thread  
  14.   
  15. class Producer(threading.Thread):  
  16.   
  17.     def __init__(self, t_name, queue):  
  18.   
  19.         threading.Thread.__init__(self, name=t_name)  
  20.   
  21.         self.data=queue  
  22.   
  23.     def run(self):  
  24.   
  25.         for i in range(5):  
  26.   
  27.             print "%s: %s is producing %d to the queue!\n" %(time.ctime(), self.getName(), i)  
  28.   
  29.             self.data.put(i)  
  30.   
  31.             time.sleep(random.randrange(10)/5)  
  32.   
  33.         print "%s: %s finished!" %(time.ctime(), self.getName())  
  34.   
  35.    
  36.   
  37. #Consumer thread  
  38.   
  39. class Consumer(threading.Thread):  
  40.   
  41.     def __init__(self, t_name, queue):  
  42.   
  43.         threading.Thread.__init__(self, name=t_name)  
  44.   
  45.         self.data=queue  
  46.   
  47.     def run(self):  
  48.   
  49.         for i in range(5):  
  50.   
  51.             val = self.data.get()  
  52.   
  53.             print "%s: %s is consuming. %d in the queue is consumed!\n" %(time.ctime(), self.getName(), val)  
  54.   
  55.             time.sleep(random.randrange(10))  
  56.   
  57.         print "%s: %s finished!" %(time.ctime(), self.getName())  
  58.   
  59.    
  60.   
  61. #Main thread  
  62.   
  63. def main():  
  64.   
  65.     queue = Queue()  
  66.   
  67.     producer = Producer('Pro.', queue)  
  68.   
  69.     consumer = Consumer('Con.', queue)  
  70.   
  71.     producer.start()  
  72.   
  73.     consumer.start()  
  74.   
  75.     producer.join()  
  76.   
  77.     consumer.join()  
  78.   
  79.     print 'All threads terminate!'  
  80.   
  81.    
  82.   
  83. if __name__ == '__main__':  
  84.   
  85.     main()  

 

 

在上面的例子中,Producer在随机的时间内生产一个“产品”,放入队列中。Consumer发现队列中有了“产品”,就去消费它。本例中,由于Producer生产的速度快于Consumer消费的速度,所以往往Producer生产好几个“产品”后,Consumer才消费一个产品。

Queue模块实现了一个支持多producer和多consumerFIFO队列。当共享信息需要安全的在多线程之间交换时,Queue非常有用。Queue的默认长度是无限的,但是可以设置其构造函数的maxsize参数来设定其长度。Queueput方法在队尾插入,该方法的原型是:

put( item[, block[, timeout]])

如果可选参数blocktrue并且timeoutNone(缺省值),线程被block,直到队列空出一个数据单元。如果timeout大于0,在timeout的时间内,仍然没有可用的数据单元,Full exception被抛出。反之,如果block参数为false(忽略timeout参数),item被立即加入到空闲数据单元中,如果没有空闲数据单元,Full exception被抛出。

Queueget方法是从队首取数据,其参数和put方法一样。如果block参数为truetimeoutNone(缺省值),线程被block,直到队列中有数据。如果timeout大于0,在timeout时间内,仍然没有可取数据,Empty exception被抛出。反之,如果block参数为false(忽略timeout参数),队列中的数据被立即取出。如果此时没有可取数据,Empty exception也会被抛出。

  评论这张
 
阅读(114)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017