方便的队列
当我们处理多线程的资源共享时,线程模块的管理会变得很复杂。我们已经看到了,Python线程模块提供了很多同步原语,包括锁、信号量、条件变量、事件等。虽然有这么多的选择,但是使用队列可能会是管理线程同步的最佳拍档。队列使用起来很容易,因为该模块提供了同步的,安全的对序列,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue.这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的通信: Queue模块中的常用方法:
- Queue.qsize():返回队列的大小
- Queue.empty():如果队列为空,返回True,反之False
- Queue.full():如果队列满了,返回True,反之False
- Queue.full:与 maxsize 大小对应
- Queue.get([block[, timeout]]):获取队列,timeout等待时间
- Queue.get_nowait() :相当Queue.get(False)
- Queue.put(item):写入队列,timeout等待时间
- Queue.put_nowait(item):相当Queue.put(item, False)
- Queue.task_done():在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
- Queue.join():实际上意味着等到队列为空,再执行别的操作
生产者-消费者模型
利用队列实现生产者-消费者模型:
import threading
import queue
import random
import time
# 创建一个队列
q = queue.Queue()
# 假定商品序号
item = 0
def produecr():
global item
while True:
time.sleep(1)
item = random.randint(1, 10)
# 将一个“商品”推到队列中
q.put(item)
print('producer {}th gooos append to q.'.format(item))
time.sleep(1)
def consumer():
while True:
# 在队列中删除一个“商品”,并返回该“商品”
item = q.get()
print(threading.currentThread().getName() +
'consumer get {}th goods from q.'.format(item))
q.task_done()
if __name__ == "__main__":
threads_consumr = []
for i in range(3):
t = threading.Thread(target=consumer)
t.start()
threads_consumr .append(t)
thread_producer = threading.Thread(target=produecr)
thread_producer.start()
q.join()
for t in threads_consumr:
t.join()
thread_producer.join()
复制代码
运行截图如下: