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

浙公网安备 33010602011771号