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模拟enum枚举类型的方法小结
Apr 30 Python
深入理解python try异常处理机制
Jun 01 Python
Python中字典的浅拷贝与深拷贝用法实例分析
Jan 02 Python
Python selenium实现微博自动登录的示例代码
May 16 Python
python3实现逐字输出的方法
Jan 23 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
python3实现单目标粒子群算法
Nov 14 Python
Python 炫技操作之合并字典的七种方法
Apr 10 Python
解析Tensorflow之MNIST的使用
Jun 30 Python
Python生成并下载文件后端代码实例
Aug 31 Python
Python连接mysql方法及常用参数
Sep 01 Python
Python3.9新特性详解
Oct 10 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 JSON 数据解析代码
2010/05/26 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
2020/04/14 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
Jquery日历插件制作简单日历
2015/10/28 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
jQuery用noConflict代替$的实现方法
2017/04/12 jQuery
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
[52:20]DOTA2-DPC中国联赛正赛 SAG vs XGBO3 第一场 3月5日
2021/03/11 DOTA
python中函数总结之装饰器闭包详解
2016/06/12 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
python 3.6.2 安装配置方法图文教程
2018/09/18 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
阿波罗盒子:Apollo Box
2017/08/14 全球购物
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
类如何去实现接口
2013/12/19 面试题
what is the difference between ext2 and ext3
2013/11/03 面试题
人力资源管理专业自荐书范文
2014/02/10 职场文书
委托书范文
2014/04/02 职场文书
2014年五一劳动节社区活动总结
2014/04/14 职场文书
乡镇消防安全责任书
2014/07/23 职场文书
办公用房租赁协议书
2014/11/29 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
vue中的可拖拽宽度div的实现示例
2022/04/08 Vue.js