线程间使用队列来互相交换数据,数据可以是字符串 、列表 、元组等,Queue 是提供队列操作的模块,常见的队列如下:

FIFO:First In First Out 先进先出队列,也就是最先放进去的数据,会被先拿出来,可以用 Queue.Queue() 来实现
LIFO:Last In First Out 后进先出队列,也就是最先放进去的数据,会到最后才被拿出来,可以用 Queue.LifoQueue() 来实现
Priority:指定优先级队列,也就是可以指定优先拿出哪些数据,可以用 Queue.PriorityQueue() 来实现

Queue 常见用法:

queue = Queue.Queue(maxsize=200)  用于创建一个队列对象,maxsize 用于指定队列的最大长度,一条数据就是长度就是1
queue.maxsize:查看队列的最大长度
queue.queue.clear():用于清空队列里的数据
queue.empty():查看队列是否为空,如果为空返回True,否则返回False
queue.full():查看队列是否已经达到指定的最大长度,如果是则返回True,否则返回False
queue.get():从队列中返回并删除一个数据,语法为:get(self, block=True, timeout=None),block=True 表示阻塞,可选参数,也就是如果队列里面是空的,我们还从队列中 get 数据,就会被阻塞,即一直停留在 get 这个动作中,直到有数据 put 进来才会 get 得到东西。默认是 block=True,如果是 blok=False 则表示不阻塞,即如果队列是空的我们还从队列中 get 数据,那么会抛出 Empty exception 这个异常,表示队列是空的;timeout=None 可以指定阻塞的时间,如果超过这个时间同样抛出 Empty exception 异常
queue.put():往队列里放入一个数据,或者说添加一个数据,语法为:put(self, item, block=True, timeout=None),其中 item 是要添加的数据;block=True 表示阻塞,可选参数,也就是即使队列满了我们也可以往里面 put 数据,只不过会先阻塞而已,等到有数据被 get 出去才会放进去,默认是 True,如果是 False 表示不阻塞,即如果队列满了我们还往里面 put 数据,就会抛出 Full exception 这个异常,表示队列已经满了;timeout=None 可以指定阻塞的时间,如果超过这个时间同样抛出 Full exception 异常

如下例子,我们往队列里添加10个数据,然后开3个线程不断从里面取出数据:

#!/usr/bin/env python
#-*- coding:utf-8 -*- import time
import Queue
import threading class Consumer(threading.Thread): def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue def run(self):
while True:
if self.queue.empty():
break
else:
data = self.queue.get()
print(data)
time.sleep(1) if __name__ == '__main__':
queue = Queue.Queue(10)
for i in range(10):
queue.put(i) for i in range(3):
c = Consumer(queue)
c.start()
[root@localhost ~]$ python 1.py
0
1
2
3
4
5
6
7
8
9

线程间通信:Queue的更多相关文章

  1. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  2. 线程间通信的三种方式(NSThread,GCD,NSOperation)

    一.NSThread线程间通信 #import "ViewController.h" @interface ViewController ()<UIScrollViewDel ...

  3. 源码分析Android Handler是如何实现线程间通信的

    源码分析Android Handler是如何实现线程间通信的 Handler作为Android消息通信的基础,它的使用是每一个开发者都必须掌握的.开发者从一开始就被告知必须在主线程中进行UI操作.但H ...

  4. Android线程间通信机制——深入理解 Looper、Handler、Message

    在Android中,经常使用Handler来实现线程间通信,必然要理解Looper , Handler , Message和MessageQueue的使用和原理,下面说一下Looper , Handl ...

  5. Android中线程间通信原理分析:Looper,MessageQueue,Handler

    自问自答的两个问题 在我们去讨论Handler,Looper,MessageQueue的关系之前,我们需要先问两个问题: 1.这一套东西搞出来是为了解决什么问题呢? 2.如果让我们来解决这个问题该怎么 ...

  6. Python简单线程间通信

    本节主要举一个简单的线程间通信的例子,利用线程安全的数据结构queue.Queue保存线程间通信的内容, import queue from threading import Thread from ...

  7. iOS开发NSOperation 三:操作依赖和监听以及线程间通信

    一:操作依赖和监听 #import "ViewController.h" @interface ViewController () @end @implementation Vie ...

  8. Java多线程编程(6)--线程间通信(下)

      因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式.   在实际的软件开发过程中,经常会碰到如下场景 ...

  9. 线程间通信 GET POST

    线程间通信有三种方法:NSThread   GCD  NSOperation       进程:操作系统里面每一个app就是一个进程. 一个进程里面可以包含多个线程,并且我们每一个app里面有且仅有一 ...

  10. Java多线程编程核心技术---线程间通信(二)

    通过管道进行线程间通信:字节流 Java提供了各种各样的输入/输出流Stream可以很方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据,一个线程发送 ...

随机推荐

  1. tomcat 部署时修改服务器时间

    tomcat 在部署时修改了服务器时间  会出现以下状况 1.session 失效 2.修改的文件不会正确被tomcat热部署进去

  2. C++基础学习-20120518

    1---------printf中的%f会自动转化成double 2---------static_cast的应用实际上static_cast真正用处并不在指针和引用上,而在基础类型和对象的转换上 s ...

  3. uboot中MAC网络(待续)

    start ->start_armboot ->main_loop 实际应用中问题:为什么从nandflash读出的MAC(写到物理phy上)与上层网口地址不同(上层网口采用env的mac ...

  4. Web API(一);Restful架构

    一.什么是RESTful REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移.REST指的是一组架构约束条件和原则.如果一个 ...

  5. Entity Framework开发介绍

    一.Entity Framework概要 Entity Framework是微软的Object Relational Mapper(对象关系映射),也就是我们平常说的ORM,它可以让应用程序开发者将关 ...

  6. debian配置ftp

    大家好,最近几天我在配置vsftpd,总结出如何更快的配置vsftpd1.我的系统是debian 5.02.安装 vsftpd, apt-get install vsftpd3.配置 vsftpdcd ...

  7. 用R作Polar图等

    用R作如下的各国Gini系数的Polar barChart: 作上图的R代码为: library(ggplot2) GiniData<- read.csv('IncomeInequality.c ...

  8. k近邻法(KNN)和KMeans算法

    k近邻算法(KNN): 三要素:k值的选择,距离的度量和分类决策规则 KMeans算法,是一种无监督学习聚类方法: 通过上述过程可以看出,和EM算法非常类似.一个简单例子, k=2: 畸变函数(dis ...

  9. java与c#的语法对比

    1,命名空间与包 C#为了把实现相似功能的类组织在一起,引入了命名空间的概念(namespace) Java中与此对应的东西叫做包(package) 2,类的访问控制方面的不同 C#只有两种:publ ...

  10. php中常用$_SERVER的用法

    #测试网址: http://localhost/blog/testurl.php?id=5 //获取域名或主机地址 echo $_SERVER['HTTP_HOST']."<br> ...