Python多线程 Queue 模块常见用法


Posted in Python onJuly 04, 2021

queue介绍

queue是python中的标准库,俗称队列,可以直接import 引用,在python2.x中,模块名为Queue
在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线程需要进行数据交换的时候,队列就出现了,队列可以完美解决线程间的数据交换,保证线程间数据的安全性和一致性

Python 的 Queue 模块中提供了同步的、线程安全的队列类,包括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 time

def a():
    print("a start\n")
    for i in range(10):
        time.sleep(0.1)
    print("a finish\n")
def b():
    print("b start\n")
    print("b finish\n")
def main():
    # t=threading.Thread(target=a,name="T")
    t = threading.Thread(target=a)
    t2=threading.Thread(target=b)
    t.start()
    t2.start()
    # t2.join()
    # t.join()
    print("all done\n")
if __name__ == '__main__':
    main()

Queue 模块:

import queue
import threading
import time

exitFlag = 0

class myThread (threading.Thread):
    def __init__(self, threadID, name, q):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.q = q
    def run(self):
        print ("开启线程:" + self.name)
        process_data(self.name, self.q)
        print ("退出线程:" + self.name)

def process_data(threadName, q):
    while not exitFlag:
        queueLock.acquire()
        if not workQueue.empty():
            data = q.get()
            queueLock.release()
            print ("%s processing %s" % (threadName, data))
        else:
            queueLock.release()
        time.sleep(1)

threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = queue.Queue(10)
threads = []
threadID = 1

# 创建新线程
for tName in threadList:
    thread = myThread(threadID, tName, workQueue)
    thread.start()
    threads.append(thread)
    threadID += 1

# 填充队列
queueLock.acquire()
for word in nameList:
    workQueue.put(word)
queueLock.release()

# 等待队列清空
while not workQueue.empty():
    pass

# 通知线程是时候退出
exitFlag = 1

# 等待所有线程完成
for t in threads:
    t.join()
print ("退出主线程")

到此这篇关于Python多线程 Queue 模块的文章就介绍到这了,更多相关Python Queue 模块内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
TensorFlow如何实现反向传播
Feb 06 Python
详解Python 协程的详细用法使用和例子
Jun 15 Python
解决pyttsx3无法封装的问题
Dec 24 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
Python进程Multiprocessing模块原理解析
Feb 28 Python
python3中sys.argv的实例用法
Apr 24 Python
python如何求圆的面积
Jul 01 Python
Python数据分析库pandas高级接口dt的使用详解
Dec 11 Python
python 中yaml文件用法大全
Jul 04 #Python
python3实现常见的排序算法(示例代码)
用Python编写简单的gRPC服务的详细过程
Jul 04 #Python
python中__slots__节约内存的具体做法
Jul 04 #Python
python中Matplotlib绘制直线的实例代码
Jul 04 #Python
C站最全Python标准库总结,你想要的都在这里
Python实现列表拼接和去重的三种方式
Jul 02 #Python
You might like
PHP封装的字符串加密解密函数
2015/12/18 PHP
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
jquery自动切换tabs选项卡的具体实现
2013/12/24 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
javascript学习笔记(二)数组和对象部分
2014/09/30 Javascript
js实现ArrayList功能附实例代码
2014/10/29 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
JS实现黑色大气的二级导航菜单效果
2015/09/18 Javascript
7个去伪存真的JavaScript面试题
2016/01/07 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
Python编程修改MP3文件名称的方法
2017/04/19 Python
python导出chrome书签到markdown文件的实例代码
2017/12/27 Python
Python批量发送post请求的实现代码
2018/05/05 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
python实现函数极小值
2019/07/10 Python
基于Python检测动态物体颜色过程解析
2019/12/04 Python
党委书记岗位职责
2013/11/24 职场文书
通信生自我鉴定
2014/01/18 职场文书
英语简历自我评价
2014/01/26 职场文书
酒店管理专业自荐信
2014/05/23 职场文书
感恩教育主题班会
2015/08/12 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL
LeetCode189轮转数组python示例
2022/08/05 Python