Python多线程通信queue队列用法实例分析

 更新时间:2020年03月24日 10:57:35   转载 作者:随风行云  
这篇文章主要介绍了Python多线程通信queue队列用法,结合实例形式分析了Python多线程通信queue队列相关概念、原理、用法及操作注意事项,需要的朋友可以参考下

本文实例讲述了Python多线程通信queue队列用法。分享给大家供大家参考,具体如下:

queue:

  • 什么是队列:是一种特殊的结构,类似于列表。不过就像排队一样,队列中的元素一旦取出,那么就会从队列中删除。
  • 线程之间的通信可以使用队列queue来进行
  • 线程如何使用queue.Queue【还有其他类型的对象下面讲】来通信:
    • 1.创建一个Queue对象:对象=queue.Queue(x),x是队列容量,x可以不填,默认没有容量限制,    
    • 2.get()可以使线程从队列中获取一个元素,如果队列为空,get会等待,get可以设置timeout参数,这是等待时间
    • 3.put()可以往队列中放入一个元素【默认队列Queue是先入先出的,先放入的元素会先取出去】,如果队列满了,put会等待,put可以设置timeout参数,这是等待时间
    • image

【下例为:sender线程发送直径给recvder线程,recvder计算得出周长】

import threading,time,queue,random
def sender():#sender发送直径
 while True:
 x=random.randint(1,10)
 print("send done:",x)
 q.put(x)#每个一秒就放入一个随机数
 time.sleep(1)#每隔一秒就放入一个a

def recvder():#recvder计算周长
 while True:
 x=q.get()
 print("recv done:",x*3.14)#每隔一秒就取出一个元素,计算结果
 time.sleep(1)

q=queue.Queue()
t1=threading.Thread(target=sender)
t2=threading.Thread(target=recvder)

t1.start()
t2.start()

t1.join()
t2.join()
  • Queue 对象已经包含了必要的锁,所以不用担心会出错
import threading,time,queue,random
def sender():#sender发送直径
 while True:
 x=random.randint(1,10)
 print("send done:",x)
 q.put(x)#每个一秒就放入一个随机数
 time.sleep(1)#每隔一秒就放入一个a

def recvder():#recvder计算周长
 while True:
 x=q.get()
 print(threading.current_thread(),"recv done:",x*3.14)#每隔一秒就取出一个元素,计算结果
 time.sleep(2)


q=queue.Queue()
t1=threading.Thread(target=sender)
t2=threading.Thread(target=recvder)
t3=threading.Thread(target=recvder)

t1.start()
t2.start()
t3.start()

t1.join()
t2.join()
t3.join()

注:

队列可以有容量限制:

image

timeout的设置:

image


队列的其他相关函数【设q为一个Queue对象】:

  • q.qsize():返回当前队列的元素个数
  • q.empty():判断队列是否空,返回布尔值
  • q.full():判断队列是否满,返回布尔值
  • q.get_nowait():直接使用get(),如果此时队列中没有元素,那么会阻塞等待,使用get_nowait()后,如果队列中没有元素,那么会报错
  • q.put_nowait():直接使用put(),如果此时队列满了,那么会阻塞等待,使用put_nowait()后,如果队列已经满了,那么会报错
  • q.task_done() :在完成一项工作之后,task_done()函数向任务已经完成的队列发送一个信号【功能类似于:有一个只能承重一个人的独木桥,A来了发现B在桥上,所以A不能上桥,他就在等,等到B过完桥后喊一下他,他才知道B过完桥了】【q.task_done主要是跟q.join()配合使用的】
  • q.join():实际上意味着等到队列为空,再执行别的操作【每次get后需要调用task_done,直到所有队列为空,这时才会执行join下面的】
import threading,queue,time
"""
这个例子是:厂家跟司机约定,生产满3个,司机才来拉,
而一个个拉走,只有当3个都拉走,厂家才继续生产
"""
def producer():#厂家
 while True:
 for i in range(3):
  q.put(i)
 start_time=time.time()
 q.join()##结果显示join这里堵塞住了厂家线程
 print("wait time:",time.time()-start_time)#用来测试是否堵塞,证明不是因为司机的sleep堵塞运行


def driver():#老司机
 while True:
 for i in range(3):
  print(q.get())
  q.task_done()
 print("")
 time.sleep(2)


q=queue.Queue()
t1=threading.Thread(target=producer)
t2=threading.Thread(target=driver)

t1.start()
t2.start()

t1.join()
t2.join()

image


queue中除了Queue之外,还有其他的队列,下面是常用的几个:

  • Queue是先入先出的队列:

image

  • LifoQueue则是后入先出的队列

image

  • PriorityQueue是由装入元素时指定的优先级来决定出元素的顺序的:
    • 创建方法:队列对象=queue.PriorityQueue()
    • 优先级是小的优先,但不能混合排序,str的只能跟str的一起排序,int的只能跟int一起排序
    • PriorityQueue的put的参数是元组,格式为:队列对象.put((优先级, 数据))

imageimage

  • deque 是双端队列,允许先入先出和后入后出,即两端都可以出

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总

希望本文所述对大家Python程序设计有所帮助。

相关文章

  • Python Numpy库安装与基本操作示例

    Python Numpy库安装与基本操作示例

    这篇文章主要介绍了Python Numpy库安装与基本操作,简单介绍了Numpy库的基本功能、并结合实例形式分析了基于Numpy库的数组与矩阵相关操作技巧,需要的朋友可以参考下
    2019-01-01
  • python爬虫面试宝典(常见问题)

    python爬虫面试宝典(常见问题)

    这篇文章主要介绍了python爬虫面试宝典及常见问题小结,需要的朋友可以参考下
    2018-03-03
  • Python向日志输出中添加上下文信息

    Python向日志输出中添加上下文信息

    这篇文章主要介绍了Python向日志输出中添加上下文信息的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-05-05
  • python中的实例方法、静态方法、类方法、类变量和实例变量浅析

    python中的实例方法、静态方法、类方法、类变量和实例变量浅析

    这篇文章主要介绍了python中的实例方法、静态方法、类方法、类变量和实例变量浅析,需要的朋友可以参考下
    2014-04-04
  • Python安装模块的常见问题及解决方法

    Python安装模块的常见问题及解决方法

    下面小编就为大家分享一篇Python安装模块的常见问题及解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • Python3匿名函数lambda介绍与使用示例

    Python3匿名函数lambda介绍与使用示例

    这篇文章主要给大家介绍了关于Python3匿名函数lambda与使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python3具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • 简单了解python列表和元组的区别

    简单了解python列表和元组的区别

    这篇文章主要介绍了简单了解python列表和元组的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Python开发之Nginx+uWSGI+virtualenv多项目部署教程

    Python开发之Nginx+uWSGI+virtualenv多项目部署教程

    这篇文章主要介绍了Python系列之-Nginx+uWSGI+virtualenv多项目部署教程,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • 跟老齐学Python之让人欢喜让人忧的迭代

    跟老齐学Python之让人欢喜让人忧的迭代

    跟一些比较牛X的程序员交流,经常听到他们嘴里冒出一个不标准的英文单词,而loop、iterate、traversal和recursion如果不在其内,总觉得他还不够牛X。当让,真正牛X的绝对不会这么说的,他们只是说“循环、迭代、遍历、递归”,然后再问“这个你懂吗?”。
    2014-10-10
  • python读取oracle函数返回值

    python读取oracle函数返回值

    这篇文章主要介绍了python读取oracle函数返回值的相关资料,感兴趣的小伙伴们可以参考一下
    2016-07-07

最新评论