尽管在Python中可以使用各种锁和同步原语的组合编写非常传统的多线程程序,但有一种首推的编程方式要优于其他所有编程方式
即将多线程程序组织为多个独立人物的集合,这些任务之间通过消息队列进行通信

queue模块(在python2中叫Queue)实现了各种多生产者-多消费者队列,可用于在执行的多个线程之间安全地交换信息。

queue模块定义了三种不同的队列类

Queue([maxsize])
创造一个FIFO(first-in-first-out,先进先出)队列。maxsize是队列中可以放入的项的最大数量,如果省略maxsize
参数或将它置为0,队列大小将为无穷大。

LifoQueue([maxsize])
创建一个LIFO(last-in-first-out,后进先出)队列(也叫栈)

PriorityQueue([maxsize])
创建一个优先级队列,其中项按照优先级从低到高依次排列。使用这种队列时,项应该是(priority, data)形式的元组,
其中priority是一个数字。

队列类的实例q具有一下方法

q.qsize()
返回队列的正确大小。因为其他线程可能正在更新队列,此方法返回的数字不完全可靠

q.empty()
如果队列为空,返回True,否则返回False

q.full()
如果队列已满,返回True,否则返回False

q.put(item[,block [,timeout]])
将item放入队列。如果可选参数block为True(默认值),调用者将被阻塞直到队列中出现可用的空闲位置为止。
否则(block为False),队列满时将引发Full异常。timeout提供可选的超时值,单位为秒。如果出现超时,将引发
Full异常

q.put_nowait(item)
等价于q.put(item, False)方法

q.get(block [,timeout])
从队列中删除一项,然后返回这个项。如果可选参数block为True(默认值),调用者将阻塞,直到队列中出现可用的
空闲闲置。否则(block为False),队列为空将引发Empty异常。timeout提供可选的超时值,单位为秒。如果出现超时
将引发Empty异常。

q.get_nowait()
等价于get(0)方法

q.task_done()
队列中数据的消费数据用来指示对于项的处理已经结束。如果使用此方法,那么队列中删除的每一项都应该调用一次。

q.join()
阻塞直到队列中的所有项均被删除和处理为止。一旦为队列中的每一项都调用了一次q.task_done()方法,此方法将会直接返回。

 import threading
from queue import Queue class WorkerThread(threading.Thread):
def __init__(self, *args, **kwargs):
threading.Thread.__init__(self, *args, **kwargs)
self.input_queue = Queue() def send(self, item):
self.input_queue.put(item) def close(self):
self.input_queue.put(None)
self.input_queue.join() def run(self):
while True:
item = self.input_queue.get()
if item is None:
break
# 处理项(使用有用的工作代替)
print(item)
self.input_queue.task_done()
# 完成,指示收到和返回了哨兵
self.input_queue.task_done()
return # 使用示例
w = WorkerThread()
w.start()
w.send('hello') # 将项发给工作线程
w.send('world')
w.close()
 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("退出主线程") # http://www.runoob.com/python3/python3-multithreading.html

Python多线程笔记(三),queue模块的更多相关文章

  1. Python学习笔记三:模块

    一:模块 一个模块就是一个py文件,里面定义了一些业务函数.引用模块,可以用import语句导入.导入模块后,通过 模块.函数名(参数)  来使用模块中的函数.如果存在多个同名模块,则前面模块名需要加 ...

  2. python多线程(三)

    原文:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html 一.Python中的线程使用: Python中使用线程有两种方式: ...

  3. python学习笔记之常用模块(第五天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

  4. python学习笔记13(模块、包)

    在Python中有一个概念叫做模块(module),比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块. 模块文件以.py后缀结 ...

  5. Python面试笔记三

    1. 类继承 有如下的一段代码: python对象 如何调用类A的show方法了,方法如下: python对象 __class__方法指向了类对象,只用给他赋值类型A,然后调用方法show,但是用完了 ...

  6. Python学习笔记十_模块、第三方模块安装、模块导入

    一.模块.包 1.模块 模块实质上就是一个python文件.它是用来组织代码的,意思就是把python代码写到里面,文件名就是模块的名称,test.py test就是模块的名称 2.包 包,packa ...

  7. python学习笔记(六):常用模块

    一.模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 什么是包? 包, ...

  8. python 学习笔记8 (模块)

    Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python 代码段. 把相关的代码 ...

  9. 吴裕雄--天生自然python学习笔记:Python3 模块

    Python3 模块 在前面的几个章节中我们脚本上是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了. 为此 Python 提供了一个办 ...

随机推荐

  1. go 实现简单的http web服务

    package main import ( "fmt" "net/http" ) func hello(w http.ResponseWriter, r *ht ...

  2. Selenium 调用IEDriverServer打开IE浏览器

    Selenium 调用IEDriverServer打开IE浏览器 2016年03月30日 09:49:37 标签: selenium 14836 Selenium 调用IEDriverServer打开 ...

  3. .ajaxStart() / .ajaxStop() —— ajax请求开始时 / 结束时触发

    一..ajaxStart()——ajax请求开始时触发  描述:ajax请求开始时触发 .ajaxStart()的回调函数,全局的,所有的ajax都可以用 写法:元素.ajaxStart(functi ...

  4. Java Swing中文乱码解决方法

    Run As Run Configuration,在Arguments中增加下面这句: -Dfile.encoding=gbk

  5. vue 鼠标移入移出事件执行多次(尤其ie)

    来自:https://www.cnblogs.com/myfirstboke/p/9150809.html  侵删 <p @mouseover="over($event)" ...

  6. JavaScript CryptoJS库 加密与解密

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. java包装类的自动装箱及缓存

    首先看下面一段代码 public static void main(String[] args) { Integer a=1; Integer b=2; Integer c=3; Integer d= ...

  8. Linux学习笔记(十六)Linux网络管理:网络基础(一)

    一.OSI7层模型协议 二.TCP/IP四层协议模型(五层) 1.网络接入层 网络接入层与OSI参考模型中的物理层和数据链路层相对应,它负责监视数据在主机和网络之间的交换.事实上,TCP/IP本身并未 ...

  9. Visual Studio C# 利用git和github协同开发时产生冲突的解决办

    Visual Studio C# 利用git和Github协同开发时产生冲突的解决办法 前言:在前两天的助教作业中,发现了自己没有办法解决在用vs开发C#的窗体项目的过程中产生的冲突问题,在查阅了资料 ...

  10. python高级特性-sorted()

    1.数字排序 >>> sorted([1,-12,13,-4],key=abs) [1, -4, -12, 13] 2.字符串排序 按ASCII排序 默认情况下,对字符串排序,是按照 ...