python基础 - 队列Queue

  queue is especially useful in threaded programming when information must be exchanged safely between multiple threads.

queue列队类的方法

队列基本操作:

import queue

q = queue.Queue(maxsize=10) #参数设置队列容量,小于1代表无限容量

q.put('James')
q.put('Joe',0) #第二个参数大于容量默认阻塞,0为报错

#FIFO先进先出
print(q.get())
print(q.get())
print(q.get(0)) #无参数多取出默认阻塞,0为报错

#队列取出顺序可以修改,队列为多线程利器,在多线程中列表不安全。

队列常用方法:

此包中的常用方法(q = Queue.Queue()):
#q.qsize() 返回队列的大小
#q.empty() 如果队列为空,返回True,反之False
#q.full() 如果队列满了,返回True,反之False
#q.full 与 maxsize 大小对应
#q.get([block[, timeout]]) 获取队列,timeout等待时间
#q.get_nowait() 相当q.get(False)  非阻塞 q.put(item) 写入队列,timeout等待时间
#q.put_nowait(item) 相当q.put(item, False)
#q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
#q.join() 实际上意味着等到队列为空,再执行别的操作

示例:

import threading,queue
from time import sleep
from random import randint

class Producer(threading.Thread):
    def run(self):
        while True:
            r=randint(0,100)
            q.put(r)
            print("生产出来%s号包子"%r)
            sleep(1)

class Consumer(threading.Thread):
    def run(self):
        while True:
            re=q.get()
            print("吃掉%s号包子"%re)

if __name__=="__main__":
    q=queue.Queue(10)
    threads=[Producer(),Producer(),Producer(),Consumer()]
    for t in threads:
        t.start()

 

★★线程可能会同时取到列表中的一个元素,故列表对线程是不安全的。

import threading,time

li=[1,2,3,4,5]

def pri():
    while li:
        a=li[-1]
        print(a)
        time.sleep(1)
        try:
            li.remove(a)
        except:
            print('----',a)

t1=threading.Thread(target=pri,args=())
t1.start()
t2=threading.Thread(target=pri,args=())
t2.start()

  

posted @ 2018-04-13 19:09  皮蛋小顽童  阅读(199)  评论(0编辑  收藏  举报