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写的Discuz7.2版faq.php注入漏洞工具
Aug 06 Python
python通过zlib实现压缩与解压字符串的方法
Nov 19 Python
python简单获取本机计算机名和IP地址的方法
Jun 03 Python
Python中进程和线程的区别详解
Oct 29 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
django+mysql的使用示例
Nov 23 Python
深入解析Python小白学习【操作列表】
Mar 23 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
Feb 14 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
Pycharm安装第三方库失败解决方案
Nov 17 Python
Python 中如何使用 virtualenv 管理虚拟环境
Jan 21 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动态添加url查询参数的方法
2015/04/14 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
CodeIgniter中使用Smarty3基本配置
2015/06/29 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
JS使用getComputedStyle()方法获取CSS属性值
2014/04/23 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
JavaScript数组的栈方法与队列方法详解
2016/05/26 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
2016/08/25 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
jQuery实现页面顶部下拉广告
2016/12/30 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
2017/05/03 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
[02:24]DOTA2痛苦女王 英雄基础教程
2013/11/26 DOTA
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
Python selenium 三种等待方式解读
2016/09/15 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
PyQt5实现五子棋游戏(人机对弈)
2020/03/24 Python
对python3 sort sorted 函数的应用详解
2019/06/27 Python
通过 Python 和 OpenCV 实现目标数量监控
2020/01/05 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
微软新西兰官方网站:Microsoft New Zealand
2018/08/17 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
美术师范毕业生自荐信
2013/11/16 职场文书
电气工程和自动化自荐信范文
2013/12/25 职场文书
任命书怎么写
2014/06/04 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
导游词之阳朔遇龙河
2019/12/16 职场文书