python3队列模块queue用法详解

在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()返回一个信号来执行下步操作

menu.saveimg.savepath20181211124929.jpg

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/555.html