Fork me on GitHub

一 概念:
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,是一种操作受限制的线性表。
进行插入操作的端称为队尾,进行删除操作的端称为队头,核心概念是先进先出。
  • Queue.qsize() 返回队列的大小
  • Queue.empty() 如果队列为空,返回True,反之False
  • Queue.full() 如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应
  • Queue.get([block[, timeout]])获取队列,timeout等待时间
  • Queue.get_nowait() 相当于Queue.get(False),非阻塞方法
  • Queue.put(item) 写入队列,timeout等待时间
  • Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。
  • Queue.join() 实际上意味着等到队列为空,再执行别的操作
 
二 实例解析
代码
import threading
import queue
import time

# 创建队列,用于存储数据
q = queue.Queue()
icnt = 0
def producer():
    while True:
        global icnt
        icnt = icnt + 1
        #print("producer icnt is:%d "%icnt)
        data = "hello world"
        print("producer is:",icnt)
        q.put(data) # 生产者线程函数,向队列存入数据
        q.join()
        data = "hello queue aaa "
        print("producer is:aaa ",icnt)
        q.put(data) # 生产者线程函数,向队列存入数据
        q.join()
        time.sleep(1)

def consumer():
    while True:
        data = q.get() # 消费者线程,从队列取出数据
        q.task_done()
        print("consumer is:",data)


# 创建并启动生产者、消费者线程
t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer)
t1.start()
t2.start()

# 等待线程结束

t1.join()
t2.join()

 

posted on 2023-10-08 11:21  虚生  阅读(43)  评论(0编辑  收藏  举报