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 相关文章推荐
Python中使用ElementTree解析XML示例
Jun 02 Python
Python程序中的观察者模式结构编写示例
May 27 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
Mar 12 Python
python实现解数独程序代码
Apr 12 Python
利用python写个下载teahour音频的小脚本
May 08 Python
python 判断字符串中是否含有汉字或非汉字的实例
Jul 15 Python
Keras - GPU ID 和显存占用设定步骤
Jun 22 Python
django和flask哪个值得研究学习
Jul 31 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
Aug 28 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 22 Python
Python如何把不同类型数据的json序列化
Apr 30 Python
python中__slots__节约内存的具体做法
Jul 04 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初学者头疼问题总结
2006/07/08 PHP
PHP新手上路(十一)
2006/10/09 PHP
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
判断多个input type=file是否有已经选择好文件的代码
2012/05/23 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
jQuery弹出div层过2秒自动消失
2016/11/29 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
Angular在一个页面中使用两个ng-app的方法
2017/02/20 Javascript
在 Node.js 中使用 async 函数的方法
2017/11/17 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
关于layui toolbar和template的结合使用方法
2019/09/19 Javascript
[08:08]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY
2014/06/25 DOTA
Python中List.count()方法的使用教程
2015/05/20 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
2017/05/03 Python
Python 模拟购物车的实例讲解
2017/09/11 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
python找出完数的方法
2018/11/12 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
新三好学生主要事迹
2014/01/23 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
党员反对四风思想汇报范文
2014/10/25 职场文书
辞职信格式范文
2015/05/13 职场文书
Python实现信息轰炸工具(再也不怕说不过别人了)
2021/06/11 Python
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python