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()