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实现百度关键词排名查询
Mar 30 Python
详解Python中的type()方法的使用
May 21 Python
详解Swift中属性的声明与作用
Jun 30 Python
python 网络编程详解及简单实例
Apr 25 Python
Mac中升级Python2.7到Python3.5步骤详解
Apr 27 Python
python基于twisted框架编写简单聊天室
Jan 02 Python
Python lambda表达式用法实例分析
Dec 25 Python
python实现自动获取IP并发送到邮箱
Dec 26 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
pytorch 模拟关系拟合——回归实例
Jan 14 Python
tensorflow模型继续训练 fineturn实例
Jan 21 Python
Python+PyQt5实现灭霸响指功能
May 25 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无限级栏目分类读取的实现代码
2014/02/19 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
2015/04/20 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
javascript event 事件解析
2011/01/31 Javascript
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
document.createElement()用法
2013/03/13 Javascript
初识SmartJS - AOP三剑客
2014/06/08 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
2014/09/21 Javascript
js实现下拉框选择要显示图片的方法
2015/02/16 Javascript
浅析jQuery Ajax通用js封装
2016/06/22 Javascript
在javascript中使用com组件的简单实现方法
2016/08/17 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
setTimeout与setInterval的区别浅析
2019/03/23 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
vue router返回到指定的路由的场景分析
2020/11/10 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
Python3.x+迅雷x 自动下载高分电影的实现方法
2020/01/12 Python
Python 删除List元素的三种方法remove、pop、del
2020/11/16 Python
巡警年度自我鉴定
2014/02/21 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
反四风对照检查材料思想汇报
2014/09/16 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
个人年底工作总结
2015/03/10 职场文书
工地材料员岗位职责
2015/04/11 职场文书
初一年级组工作总结
2015/08/12 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
Python进程池与进程锁之语法学习
2022/04/11 Python