Python的Queue模块提供一种适用于多线程编程的FIFO实现。它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个线程可以共用同一个Queue实例。Queue的大小(元素的个数)可用来限制内存的使用。

Basic FIFO Queue

Queue类实现了一个基本的先进先出(FIFO)容器,使用put()将元素添加到序列尾端,get()从队列尾部移除元素。

LIFO Queue

与标准FIFO实现Queue不同的是,LifoQueue使用后进先出序(会关联一个栈数据结构)。

Priority Queue(优先队列)

除了按元素入列顺序外,有时需要根据队列中元素的特性来决定元素的处理顺序。例如,财务部门的打印任务可能比码农的代码打印任务优先级更高。PriorityQueue依据队列中内容的排序顺序(sort order)来决定那个元素将被检索。

Using Queues with Threads

queue介绍

  • queue是python中的标准库,俗称队列,可以直接import 引用,在python2.x中,模块名为Queue
  • 在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线程需要进行数据交换的时候,队列就出现了,队列可以完美解决线程间的数据交换,保证线程间数据的安全性和一致性

queue模块有三种队列及构造函数:

  1. Python queue模块的FIFO队列先进先出。 class queue.Queue(maxsize)
  2. LIFO类似于堆,即先进后出。 class queue.LifoQueue(maxsize)
  3. 还有一种是优先级队列级别越低越先出来。 class queue.PriorityQueue(maxsize)

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() 实际上意味着等到队列为空,再执行别的操作

代码例子:

  1. # coding: utf-8
  2.  
  3. from queue import Queue
  4.  
  5. # Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递
  6. def test_queue():
  7.  
  8. q=Queue(10)
  9. for i in range(5):
  10. q.put(i)
  11. while not q.empty():
  12. print(q.get())
  13.  
  14. def test_LifoQueue():
  15. import queue
  16. # queue.LifoQueue() #后进先出->堆栈
  17. q = queue.LifoQueue(3)
  18. q.put(1)
  19. q.put(2)
  20. q.put(3)
  21. print(q.get())
  22. print(q.get())
  23. print(q.get())
  24.  
  25. def test_PriorityQueue():
  26. import queue
  27. # queue.PriorityQueue() #优先级
  28. q = queue.PriorityQueue(3) # 优先级,优先级用数字表示,数字越小优先级越高
  29. q.put((10, 'a'))
  30. q.put((-1, 'b'))
  31. q.put((100, 'c'))
  32. print(q.get())
  33. print(q.get())
  34. print(q.get())
  35.  
  36. # Python queue队列,实现并发,在网站多线程推荐最后也一个例子,比这货简单,但是不够规范
  37.  
  38. from queue import Queue # Queue在3.x中改成了queue
  39. import random
  40. import threading
  41. import time
  42. from threading import Thread
  43.  
  44. class Producer(threading.Thread):
  45. """
  46. Producer thread 制作线程
  47. """
  48. def __init__(self, t_name, queue): # 传入线程名、实例化队列
  49. threading.Thread.__init__(self, name=t_name) # t_name即是threadName
  50. self.data = queue
  51.  
  52. """
  53. run方法 和start方法:
  54. 它们都是从Thread继承而来的,run()方法将在线程开启后执行,
  55. 可以把相关的逻辑写到run方法中(通常把run方法称为活动[Activity]);
  56. start()方法用于启动线程。
  57. """
  58.  
  59. def run(self):
  60. for i in range(5): # 生成0-4五条队列
  61. print("%s: %s is producing %d to the queue!" % (time.ctime(), self.getName(), i)) # 当前时间t生成编号d并加入队列
  62. self.data.put(i) # 写入队列编号
  63. time.sleep(random.randrange(10) / 5) # 随机休息一会
  64. print("%s: %s producing finished!" % (time.ctime(), self.getName)) # 编号d队列完成制作
  65.  
  66. class Consumer(threading.Thread):
  67. """
  68. Consumer thread 消费线程,感觉来源于COOKBOOK
  69. """
  70. def __init__(self, t_name, queue):
  71. threading.Thread.__init__(self, name=t_name)
  72. self.data = queue
  73.  
  74. def run(self):
  75. for i in range(5):
  76. val = self.data.get()
  77. print("%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(), self.getName(), val)) # 编号d队列已经被消费
  78. time.sleep(random.randrange(10))
  79. print("%s: %s consuming finished!" % (time.ctime(), self.getName())) # 编号d队列完成消费
  80.  
  81. def main():
  82. """
  83. Main thread 主线程
  84. """
  85. queue = Queue() # 队列实例化
  86. producer = Producer('Pro.', queue) # 调用对象,并传如参数线程名、实例化队列
  87. consumer = Consumer('Con.', queue) # 同上,在制造的同时进行消费
  88. producer.start() # 开始制造
  89. consumer.start() # 开始消费
  90. """
  91. join()的作用是,在子线程完成运行之前,这个子线程的父线程将一直被阻塞。
  92.    join()方法的位置是在for循环外的,也就是说必须等待for循环里的两个进程都结束后,才去执行主进程。
  93. """
  94. producer.join()
  95. consumer.join()
  96. print('All threads terminate!')
  97.  
  98. if __name__=="__main__":
  99.  
  100. test_queue()
  101.  
  102. print("=====后进先出=====")
  103. test_LifoQueue()
  104.  
  105. print("=====优先级======")
  106. test_PriorityQueue()
  107.  
  108. main()

线程模块

- 多线程主要的内容:直接进行多线程操作,线程同步,带队列的多线程;

Python3 通过两个标准库 _thread 和 threading 提供对线程的支持。

_thread 提供了低级别的、原始的线程以及一个简单的锁,它相比于 threading 模块的功能还是比较有限的。

threading 模块除了包含 _thread 模块中的所有方法外,还提供的其他方法:

  • threading.currentThread(): 返回当前的线程变量。
  • threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
  • threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:

  • run(): 用以表示线程活动的方法。
  • start():启动线程活动。
  • join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
  • isAlive(): 返回线程是否活动的。
  • getName(): 返回线程名。
  • setName(): 设置线程名。
  1. #queue 多线程各个线程的运算的值放到一个队列中,到主线程的时候再拿出来,以此来代替
  2. #return的功能,因为在线程是不能返回一个值的
    # https://www.cnblogs.com/zephyr-1/p/6043785.html
  3. import time
  4. import threading
  5. from Queue import Queue
  6.  
  7. def job(l,q):
  8. q.put([i**2 for i in l])
  9.  
  10. def multithreading(data):
  11. q = Queue()
  12. threads = []
  13. for i in xrange(4):
  14. t = threading.Thread(target = job,args = (data[i],q))
  15. t.start()
  16. threads.append(t)
  17. for thread in threads:
  18. thread.join()
  19. results = []
  20. for _ in range(4):
  21. results.append(q.get())
  22. print results
  23.  
  24. if __name__ == "__main__":
  25. data = [[1,2,3],[4,5,6],[3,4,3],[5,5,5]]
  26. multithreading(data)
  27.  
  28. [[1, 4, 9], [16, 25, 36], [9, 16, 9], [25, 25, 25]]

Python中Queue模块及多线程使用的更多相关文章

  1. Python队列queue模块

    Python中queue模块常用来处理队列相关问题 队列常用于生产者消费者模型,主要功能为提高效率和程序解耦 1. queue模块的基本使用和相关说明 # -*- coding:utf-8 -*- # ...

  2. 聊聊Python中的多进程和多线程

    今天,想谈一下Python中的进程和线程. 最近在学习Django的时候,涉及到了多进程和多线程的知识点,所以想着一下把Python中的这块知识进行总结,所以系统地学习了一遍,将知识梳理如下. 1. ...

  3. 深入浅析python中的多进程、多线程、协程

    深入浅析python中的多进程.多线程.协程 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源 ...

  4. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

  5. Python中optionParser模块的使用方法[转]

    本文以实例形式较为详尽的讲述了Python中optionParser模块的使用方法,对于深入学习Python有很好的借鉴价值.分享给大家供大家参考之用.具体分析如下: 一般来说,Python中有两个内 ...

  6. 【转】关于python中re模块split方法的使用

    注:最近在研究文本处理,需要用到正则切割文本,所以收索到了这篇文章,很有用,谢谢原作者. 原址:http://blog.sciencenet.cn/blog-314114-775285.html 关于 ...

  7. Python中的模块介绍和使用

    在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一 ...

  8. python中导入模块的本质, 无法导入手写模块的解决办法

    最近身边一些朋友发生在项目当中编写自己模块,导入的时候无法导入的问题. 下面我来分享一下关于python中导入模块的一些基本知识. 1 导入模块时寻找路径 在每一个运行的python程序当中,都维护了 ...

  9. Python中time模块详解

    Python中time模块详解 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. ...

随机推荐

  1. python 全栈开发,Day12(函数的有用信息,带参数的装饰器,多个装饰器装饰一个函数)

    函数的执行时,*打散.函数的定义时,*聚合. from functools import wraps def wrapper(f): # f = func1 @wraps(f) def inner(* ...

  2. Lucene.Net简介

    说明:Lucene.Net 只是一个全文检索开发包 .查询数据的时候从Lucene.Net查询数据.可以看做是一个提供了全文检索功能的数据库. 注意:只能搜索文本字符串. 重要概念:分词,基于词库的分 ...

  3. python小知识-属性查询优先级(如果有同名类属性、数据描述符、实例属性存在的话,实例>类>数据描述符)

    https://www.cnblogs.com/Jimmy1988/p/6808237.html https://segmentfault.com/a/1190000006660339 https:/ ...

  4. Codeforces 1000F One Occurrence 主席树|| 离线+线段树

    One Occurrence 为什么我半年前这么菜呀, 这种场只A三题... 我们在主席树 || 线段树上维护每个数的右边和它一样的数在哪里, 然后就变成了区间求最大值. 注意加进去的时候要把它右边一 ...

  5. 062 hive中的常用方法(case,cast,unix_timestamp)

    1.case的用法 )格式1 case col when value then '' when value then '' else '' end )格式2 case when col='value' ...

  6. 如何修改 FastAdmin 弹窗大小?

    如何修改 FastAdmin 弹窗大小? 参考代码 1 如下: buttons: [ { name: 'start', , , , extend: 'data-area=\'["350px& ...

  7. 《Gradle权威指南》--Android Gradle多渠道构建

    No1: Build Variant = Build Type + Product Flavor Build Variant:构建的产物 Build Type:构建的类型 Product Flavor ...

  8. hdu-1754 I Hate It【线段树】(求区间最大值)

    <题目链接> I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  9. java8 Optional正确使用姿势

    Java 8 如何正确使用 Optional import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; ...

  10. Effective Java 第三版——57. 最小化局部变量的作用域

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...