一,python队列
Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。
#队列
#put() put_nowait() get() get_nowait() qsize() full() empty() task_down()任务完成返回消息 join() 收到后继续主线程
q = queue.Queue(maxsize=3) #创建一个队列,参数指定队列长度最大为3
q.put(1) #将1放入队列
q.put_nowait(2) #等同于q.put(timeout=True)
print(q.get()) #获取一个值,先入先出
print(q.get_nowait())q.get(timeout=True)
print(q.qsize()) # 2个值已经被取出了,所以队列长度为0
print(q.full()) #查看队列是否满了
print(q.empty()) #查看队列是否为空
q.task_done() #告诉主线程我已经完成了一个任务了
q.join() #所有任务完成再进行下面的代码即主线程
print("任务执行完成!!!")
#输出--------------------------------
1
2
0
False
True
以上代码为什么没有打印最后一句话,因为队列里面2个任务,q.task_done()只返回了一个任务完成,所以一直在等待,不会执行执行主线程代码;
如果我们收到两个q.task_done(),那就可以正常执行了,如下
q = queue.Queue(maxsize=3) #创建一个队列,参数指定队列长度最大为3
q.put(1) #将1放入队列
q.put_nowait(2)
print(q.get()) #获取一个值
print(q.get_nowait())
print(q.qsize()) # 2个值已经被取出了,所以队列长度为0
print(q.full()) #查看队列是否满了
print(q.empty()) #查看队列是否为空
q.task_done() #告诉主线程我已经完成了一个任务了
q.task_done()
q.join() #所有任务完成再进行下面的代码即主线程
print("任务执行完成!!!")
#输出----------------------------------------
1
2
0
False
True
任务执行完成!!!
二,先入后出队列
可以看到先放进队列的后被取出,其他用法和(先入先出)队列Queue一样;
q2 = queue.LifoQueue()
q2.put(1)
q2.put(2)
print(q2.get())
print(q2.get())
#输出-------------------------------
2
1
三,优先级队列
优先级队列,第一个值传数字,代表优先级,第二个是值,优先取出的是优先级高的;
q3 = queue.PriorityQueue()
q3.put([4,"666"])
q3.put([3,"54353"])
q3.put([1,"dmfnm"])
print(q3.get())
print(q3.get())
print(q3.get())
#输出---------------------------
[1, 'dmfnm']
[3, '54353']
[4, '666']
四,利用队列和多线程实现生产者消费者模式
q1 = queue.Queue() #创建一个队列
class Producter(threading.Thread):
def run(self):
product = 0
if q1.qsize() <= 50:
for i in range (200):
product += 1
q1.put("-------------生产---------{}".format(product))
print("-------------生产---------{}".format(product))
else:
time.sleep(1)
class Consumer(threading.Thread):
def run(self):
reduce = 0
if q1.qsize() >= 10:
for i in range(3):
reduce += 1
q1.get()
print("-------------消费---------{}".format(reduce))
else:
time.sleep(2)
th1 = Producter() #创建1个线程
th1.start() #启动线程1
for i in range(5):
c = Consumer() #创建5个线程
c.start() #启动线程