Basic FIFO Queue

news/2024/7/3 11:25:27

Queue - 一种线程安全的FIFO实现

Python的Queue模块提供一种适用于多线程编程的FIFO实现。它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个线程可以共用同一个Queue实例。Queue的大小(元素的个数)可用来限制内存的使用。

Basic FIFO Queue

Queue类实现了一个基本的先进先出(FIFO)容器,使用put()将元素添加到序列尾端,get()从队列尾部移除元素。

+

 

from queue import Queue

q = Queue()

for i in range(3): q.put(i) while not q.empty(): print(q.get()) 

上例使用单线程演示了元素以插入顺序从队列中移除。结果如下:

0
1
2
3

LIFO Queue

与标准FIFO实现Queue不同的是,LifoQueue使用后进先出序(会关联一个栈数据结构)。

from queue import LifoQueue

q = LifoQueue()

for i in range(3): q.put(i) while not q.empty(): print(q.get()) 

最后put()到队列的元素最先被get()

2
1
0

Priority Queue(优先队列)

除了按元素入列顺序外,有时需要根据队列中元素的特性来决定元素的处理顺序。例如,财务部门的打印任务可能比码农的代码打印任务优先级更高。PriorityQueue依据队列中内容的排序顺序(sort order)来决定那个元素将被检索。

from queue import PriorityQueue


class Job(object): def __init__(self, priority, description): self.priority = priority self.description = description print('New job:', description) return def __lt__(self, other): return self.priority < other.priority q = PriorityQueue() q.put(Job(5, 'Mid-level job')) q.put(Job(10, 'Low-level job')) q.put(Job(1, 'Important job')) while not q.empty(): next_job = q.get() print('Processing job', next_job.description) 

在这个单线程示例中,job会严格按照优先级从队列中取出。如有有多个线程同时消耗这些job,在get()被调用时,job会依据其优先级被处理。

New job: Mid-level job
New job: Low-level job
New job: Important job
Processing job: Important job
Processing job: Mid-level job
Processing job: Low-level job

Using Queues with Threads

下例通过创建一个简单的播客客户端来展示如何将Queue类和多线程结合使用。这个客户端会从一个或多个RSS源读取内容,先创建一个用于存放下载内容的队列,然后使用多线程并行地处理多个下载任务。

import time
from queue import Queue
from threading import Thread #: 自己写的解析模块 import feedparser num_fetch_threads = 2 enclosure_queue = Queue() feed_urls = ['http:xxx/xxx',] def downloadEnclosures(i, q): """ 线程worker函数 用于处理队列中的元素项,这些守护线程在一个无限循环中,只有当主线程结束时才会结束循环 """ while True: print('%s: Looking for the next enclosure' % i) url = q.get() print('%s: Downloading: %s' % (i, url)) #: 用sleep代替真实的下载 time.sleep(i + 2) q.task_done() for i in range(num_fetch_threads): worker = Thread(target=downloadEnclosures, args=(i, enclosure_queue)) worker.setDaemon(True) worker.start() for url in feed_urls: response = feedparser.parse(url, agent='fetch_podcasts.py') for entry in response['entries']: for enclosure in entry.get('enclosures', []): print('Queuing:', enclosure['url']) enclosure_queue.put(enclosure['url']) # Now wait for the queue to be empty, indicating that we have # processed all of the downloads. print('*** Main thread waiting') enclosure_queue.join() print('*** Done')

http://www.niftyadmin.cn/n/4354901.html

相关文章

类 对象的定义实例和引用

类的定义、对象的定义、对象实例化、对象引用}类&#xff1b;可以理解为一类对象高度抽象而成的集合体&#xff0c;表示他们共性的组件 对象&#xff0c;则是通过类来创建一个对象&#xff1b;可以创建N多个对象 类名 对象名——则创建一个对象&#xff1b;此时称之为定义一个…

一个屌丝程序员的青春(三六三)

10后&#xff1a;什么是工作&#xff1f; 00后&#xff1a;为什么要工作&#xff1f; 95后&#xff1a;感觉不爽就离职。 90后&#xff1a;领导骂我就离职。 80后&#xff1a;有收入高就离职。 70后&#xff1a;为什么要离职&#xff1f; 60后&#xff1a;什么是离职&…

一个屌丝程序员的青春(三六四)

很多人越来越不愿意发朋友圈了&#xff0c;可能是以下原因&#xff1a; 一、生活压力大、工作压力大 越来越多的人可能每天只点开一次朋友圈&#xff0c;更别说去发朋友圈了。那些孤独的、工作轻松的、空闲时间多的人&#xff0c;可能每天会刷很多遍手机&#xff0c;翻看很多…

学习:

transform、 time、 rigid body、 input(get key、geotaxis、getaixsraw、mouse position、getbuttondown) vector3、 获取鼠标坐标、 屏幕坐标和世界坐标、 gameobject、 数组、 结构体、

一个屌丝程序员的青春(三六五)

美剧、英剧里高智商的刑侦推理剧&#xff1a; 一、《基本演绎法》 讲述福尔摩斯的故事&#xff0c;从伦敦搬到纽约。有毒瘾的福尔摩斯和有酒瘾的女版华生会擦出怎样的火花呢&#xff1f;相对于英剧版本多了些幽默戏份&#xff0c;但是沉重的案件依然是本剧的主打看点。 二、…

互联网工作原理

计算机网络是由许多计算机组成的&#xff0c;要实现网络的计算机之间传输数据&#xff0c;必须要   作两件事&#xff0c;数据传输目的地址和保证数据迅速可靠传输的措施&#xff0c;这是因为数据在传输   过程中很容易丢失或传错&#xff0c;Internet使用一种专门的计算机…

一个屌丝程序员的青春(三六六)

印度电影《起跑线》讲的就是一对夫妇为了让孩子从小就获得最好的教育、走上人生巅峰而绞尽脑汁择校的故事。 《围炉夜话》有一言&#xff0c;“富家惯习骄奢&#xff0c;最难教子&#xff1b;寒士欲谋生活&#xff0c;还是读书”。可是&#xff0c;当“寒门再难出贵子”成为社…

充电教程

01&#xff0c;《Java编程学习第一季》&#xff1a;av35556299 02&#xff0c;《Java编程学习第二季》&#xff1a;av37316788 03&#xff0c;《Java编程学习第三季》&#xff1a;av37317551 04&#xff0c;《Java编程学习第四季》&#xff1a;av38308449 05&#xff0c;《JDBC…