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 相关文章推荐
web.py中调用文件夹内模板的方法
Aug 26 Python
python函数局部变量用法实例分析
Aug 04 Python
tensorflow 输出权重到csv或txt的实例
Jun 14 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
Python实现最大子序和的方法示例
Jul 05 Python
OpenCV 模板匹配
Jul 10 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
Jul 22 Python
Python 单例设计模式用法实例分析
Sep 23 Python
Django 实现外键去除自动添加的后缀‘_id’
Nov 15 Python
解决pycharm最左侧Tool Buttons显示不全的问题
Dec 17 Python
Numpy中的数组搜索中np.where方法详细介绍
Jan 08 Python
Python实现提取PDF简历信息并存入Excel
Apr 02 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
基于HTTP长连接的"服务器推"技术的php 简易聊天室
2009/10/31 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
date.parse在IE和FF中的区别
2010/07/29 Javascript
JavaScript解析URL参数示例代码
2013/08/12 Javascript
css样式标签和js语法属性区别
2013/11/06 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
nodejs爬虫抓取数据乱码问题总结
2015/07/03 NodeJs
初步了解javascript面向对象
2015/11/09 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
python实现比较文件内容异同
2018/06/22 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
基于python实现文件加密功能
2020/01/06 Python
pytorch实现线性拟合方式
2020/01/15 Python
python读取csv文件指定行的2种方法详解
2020/02/13 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
Flask处理Web表单的实现方法
2021/01/31 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
如何客观的进行自我评价
2013/12/17 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
师范生求职信
2014/06/14 职场文书
党政领导班子四风问题对照检查材料思想汇报
2014/10/02 职场文书
通知函的格式
2015/04/27 职场文书
创业计划书之个人工作室
2019/08/22 职场文书
解析MySQL binlog
2021/06/11 MySQL
详解Vue slot插槽
2021/11/20 Vue.js
基于Python实现将列表数据生成折线图
2022/03/23 Python
《堡垒之夜》联动《刺客信条》 4月7日正式上线
2022/04/06 其他游戏
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL
python​格式化字符串
2022/04/20 Python