Python并发编程之Queue队列

  • 一、python的queue 模块
  • 二、使用Queue的示例代码

一、python的queue 模块

queue模块实现了各种多生产者-多消费者队列,可用于在执行的多个线程之间安全地交换信息。
queue模块定了3种不同的队列类。

Queue([maxsize])

创建一个FIFO先进先出队列。maxsize是队列中可以放入的项目的最大值。如果省略maxsize或将它置为0,队列大小将是无限大。

LifoQueue([maxsize])

创建一个LIFO后进先出队列,也叫做栈。

PriorityQueue([maxsize])

创建一个优先级队列,其中项目按照优先级从低到高依次排列。使用这种队列时,项目应该是(priority, data)形式的元组,其中priority是一个数字。

队列类的实例q具有以下方法:

  • q.empty()
  • q.full()
  • q.put(item [, block [, timeout]])
  • q.put_nowait(item)
  • q.get([block [, timeout]])
  • q.get_nowait()
  • q.task_done()
  • q.join()

使用队列一般可以简化多线程的程序。例如,可以使用共享队列将线程连接在一起,而不必依赖于必须有锁定保护的共享状态。在这种模型中,工作者线程一般充当数据的使用者。

二、使用Queue的示例代码

import threading
from queue import Queue

class WorkerThread(threading.Thread):
    def __init__(self, *args, **kwargs):
        threading.Thread.__init__(self, *args, **kwargs)
        self.input_queue = Queue()
        
    def send(self, item):
        self.input_queue.put(item)
    
    def close(self):
        self.input_queue.put(None)
        self.input_queue.join()
        
    def run(self):
        while True:
            item = self.input_queue.get()
            if item is None:
                break
            # 处理项目
            print(item)
            self.input_queue.task_done()
        self.input_queue.task_done()
        return
    
w = WorkerThread()
w.start()
w.send("hello")
w.send("world")
w.close()

更多推荐

Python并发编程之Queue队列