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实现的文件夹清理程序分享
Nov 22 Python
在主机商的共享服务器上部署Django站点的方法
Jul 22 Python
Python登录注册验证功能实现
Jun 18 Python
Python判断对象是否相等及eq函数的讲解
Feb 25 Python
pandas中read_csv、rolling、expanding用法详解
Apr 21 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
May 11 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
Python lambda表达式原理及用法解析
Aug 18 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
Jan 07 Python
用Python简陋模拟n阶魔方
Apr 17 Python
TensorFlow的自动求导原理分析
May 26 Python
Python中的变量与常量
Nov 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中cookie和session的区别实例分析
2014/08/28 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
PHP常用的三种设计模式
2017/02/17 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
2019/03/08 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
理解Javascript_05_原型继承原理
2010/10/13 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
JavaScript将数组转换成CSV格式的方法
2015/03/19 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
解决vue 单文件组件中样式加载问题
2019/04/24 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
2019/09/06 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
Python实现代码统计工具(终极篇)
2016/07/04 Python
Python 制作糗事百科爬虫实例
2016/09/22 Python
python 换位密码算法的实例详解
2017/07/19 Python
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
英国家电直销:Appliances Direct
2016/09/22 全球购物
英国版MAC彩妆品牌:Illamasqua
2018/04/18 全球购物
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
如何获得EntityManager
2014/02/09 面试题
《童年》教学反思
2014/02/18 职场文书
爬山的活动方案
2014/08/16 职场文书
幼儿园保育员随笔
2015/08/14 职场文书
2016天猫双十一广告语
2016/01/28 职场文书
MySQL触发器的使用
2021/05/24 MySQL
React-vscode使用jsx语法的问题及解决方法
2021/06/21 Javascript
Redis集群的关闭与重启操作
2021/07/07 Redis