当多个线程须要共享数据或者资源的时候,可能会使得线程的使用变得复杂。线程模块提供了许多同步原语,包括信号量、条件变量、事件和锁。当这些选项存在时,最佳实践是转而关注于使用队列。相比较而言,队列更容易处理,而且可使得线程编程更加安全,由于它们可以有效地传送单个线程对资源的全部访问,并支持更加清晰的、可读性更强的设计模式。 python
Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,可以在多线程中直接使用。可使用队列来实现线程间的同步。 编程
用FIFO队列实现上述生产者与消费者问题的代码以下: 设计模式
#encoding=utf-8 import threading import time from Queue import Queue class Producer(threading.Thread): def run(self): global queue count = 0 while True: for i in range(100): if queue.qsize() > 1000: pass else: count = count +1 msg = '生成产品'+str(count) queue.put(msg) print msg time.sleep(1) class Consumer(threading.Thread): def run(self): global queue while True: for i in range(3): if queue.qsize() < 100: pass else: msg = self.name + '消费了 '+queue.get() print msg time.sleep(1) queue = Queue() def test(): for i in range(500): queue.put('初始产品'+str(i)) for i in range(2): p = Producer() p.start() for i in range(5): c = Consumer() c.start() if __name__ == '__main__': test()