Python同步队列正确应用方式解析

开发
Python同步队列的实现是一个比较重要的操作技巧。在实际编程中,我们会通过这一操作技术获得更多的帮助,以完成一些特定功能。

我们今天将会通过Python同步队列的相关介绍,来详细分析一下这一编程语言中的多线程应用。希望对此又需要的朋友们可以通过本文介绍的内容充分的掌握这一应用技巧,以方便将来的实际应用。#t#

我们经常会采用生产者/消费者关系的两个线程来处理一个共享缓冲区的数据。例如一个生产者线程接受用户数据放入一个共享缓冲区里,等待一个消费者线程对数据 取出处理。但是如果缓冲区的太小而生产者和消费者两个异步线程的速度不同时,容易出现一个线程等待另一个情况。为了尽可能的缩短共享资源并以相同速度工作 的各线程的等待时间,我们可以使用一个“队列”来提供额外的缓冲区。

创建一个“队列”对象

  1. import Queue  
  2. myqueue = Queue.Queue(maxsize = 10)Queue.Queue 

类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。

 

将一个值放入队列中

 

  1. myqueue.put(10) 

调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。

将一个值从队列中取出

 

  1. myqueue.get() 

调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为1。如果队列为空且block为1,get()就使调用线程暂停,直至有项目可用。如果block为0,队列将引发Empty异常。

我们用一个Python同步队列例子来展示如何使用Queue# queue_example.py

  1. from Queue import Queue  
  2. import threading  
  3. import random  
  4. import time  
  5. # Producer thread  
  6. class Producer(threading.Thread):  
  7. def __init__(self, threadname, queue):  
  8. threading.Thread.__init__(self, name = threadname)  
  9. self.sharedata = queue 
  10. def run(self):  
  11. for i in range(20):  
  12. print self.getName(),’adding’,i,’to queue’  
  13. self.sharedata.put(i)  
  14. time.sleep(random.randrange(10)/10.0)  
  15. print self.getName(),’Finished’  
  16. # Consumer thread  
  17. class Consumer(threading.Thread):  
  18. def __init__(self, threadname, queue):  
  19. threading.Thread.__init__(self, name = threadname)  
  20. self.sharedata = queue 
  21. def run(self):  
  22. for i in range(20):  
  23. print self.getName(),’got a value:’,self.sharedata.get()  
  24. time.sleep(random.randrange(10)/10.0)  
  25. print self.getName(),’Finished’  
  26. # Main thread  
  27. def main():  
  28. queue = Queue()  
  29. producer = Producer(’Producer’, queue)  
  30. consumer = Consumer(’Consumer’, queue)  
  31. print ‘Starting threads …’  
  32. producer.start()  
  33. consumer.start()  
  34. producer.join()  
  35. consumer.join()  
  36. print ‘All threads have terminated.’  
  37. if __name__ == ‘__main__’:  
  38. main() 

 

Python同步队列示例代码中实现了两个类:生产者类Producer和消费者类Consumer。前者在一个随机的时间内放入一个值到队列queue中然后显示出来,后者在一定随机的时间内从队列queue中取出一个值并显示出来。

责任编辑:曹凯 来源: 博客园
相关推荐

2010-01-25 11:29:33

Android计时器

2010-03-04 13:30:11

Python file

2010-02-22 14:09:08

WCF Dispose

2010-03-05 15:01:29

Python解析XML

2010-03-03 17:33:52

Python读取XML

2010-03-04 14:51:21

Python Conf

2010-02-05 14:12:46

C++声明放置

2021-07-02 16:13:01

区块链金融数据库

2010-03-04 09:40:52

Python Clas

2010-05-28 15:16:40

MySQL 资源

2009-12-07 14:38:14

PHP foreach

2010-02-22 10:42:12

WCF Stream

2010-03-04 14:02:51

Python大小写

2010-05-25 18:01:35

linux MySQL

2010-05-28 19:20:36

MySQL mysql

2010-07-21 10:50:48

SQL Server存

2010-02-05 17:49:24

C++常量引用

2010-07-26 17:43:34

SQL Server

2010-02-01 15:26:44

C++ inline函

2010-08-18 16:45:40

IBM DB2 Cat
点赞
收藏

51CTO技术栈公众号