线程间通信:Queue

线程间使用队列来互相交换数据,数据可以是字符串 、列表 、元组等,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

 

 

 

 

 

 

    

 

    

posted @ 2019-02-07 20:45  孔雀东南飞  阅读(425)  评论(0编辑  收藏  举报