在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线程需要进行数据交换的时候,队列就出现了,队列可以完美解决线程间的数据交换,保证线程间数据的安全性和一致性
queue是python中的标准库,可以直接import 引用
queue模块有三种队列及构造函数:
Python queue模块的FIFO队列先进先出。 class queue.Queue(maxsize)
LIFO类似于堆,即先进后出。 class queue.LifoQueue(maxsize)
还有一种是优先级队列级别越低越先出来。 class queue.PriorityQueue(maxsize)
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() 实际上意味着等到队列为空,再执行别的操作
下面我们来一起看看实例
#!/usr/bin/python3 #coding:utf-8 from queue import Queue import pymysql def connectMysql(): conn = False try: conn = pymysql.Connect(host='127.0.0.1', port=3306, user='root', passwd='Zero20ba', db='sulao', charset='utf8') except: print("Connect MySQL failed !") conn = False return conn def getList(): cur = connectMysql().cursor() sql = '''SELECT * FROM zbp_category WHERE cate_Order=0 ORDER BY cate_ID ASC''' cur.execute(sql) dat = cur.fetchall() return dat if __name__ == "__main__": q = Queue() for tu in getList(): q.put(tu) print(q.qsize())
打印返回12
我们试试task_done()和join()两个方法
#!/usr/bin/python3 #coding:utf-8 from queue import Queue import pymysql def connectMysql(): conn = False try: conn = pymysql.Connect(host='127.0.0.1', port=3306, user='root', passwd='Zero20ba', db='sulao', charset='utf8') except: print("Connect MySQL failed !") conn = False return conn def getList(): cur = connectMysql().cursor() sql = '''SELECT * FROM zbp_category WHERE cate_Order=0 ORDER BY cate_ID ASC''' cur.execute(sql) dat = cur.fetchall() return dat if __name__ == "__main__": q = Queue() for tu in getList(): q.put(tu) while q.qsize() > 0: _task = q.get() print(_task) q.task_done() q.join() print("ok !")
使用q.join()方法感觉和多线程阻塞是一样的,队列完成后再执行下一步操作,再while循环中没执行完操作使用task_done()返回一个信号来执行下步操作