并发编程之队列

Posted plf-jack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程之队列相关的知识,希望对你有一定的参考价值。

队列:

from queue import Queue,LifoQueue,PriorityQueue

以上三种队列有什么不同?

1. Queue 与 joinableQueue类似

2. LifoQueue(栈,特点:后进先出)

from queue import Queue,LifoQueue,PriorityQueue
a = LifoQueue()     # 后进先出,栈。跟对列相比,仅是取得顺序不同
a.put(1)
a.put(2)
a.put(3)
print(a.get())
print(a.get())
print(a.get())
3
2
1

3. PriorityQueue(具备优先级的队列)

第1阶段:数字小优先级越高(进队列会排序:从小到大)
from queue import Queue,LifoQueue,PriorityQueue
q = PriorityQueue() # 具备优先级的队列,取数据时,值越小,优先级越高
q.put(1)
q.put(3)
q.put(2)

print(q.get())
print(q.get())
print(q.get())


# 比较两个元组中的数据
b  = (1,2,3,4,5)
c = (0.9,2,3,4)
d = (5,1,4,5)

q.put(b)
q.put(c)
q.put(d)

print(q.get())
print(q.get())
print(q.get())
1
2
3
(0.9, 2, 3, 4)
(1, 2, 3, 4, 5)
(5, 1, 4, 5)
第2阶段:两个类如何比较(运算符重载,重写父类的“比较大小”的方法)

需求:比较两个人的年龄,从小到大排序;如果年龄相等,则按照姓名排序。

from queue import PriorityQueue

# 定义类
class person():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    
    # 重写运算符。即运算符重载
    def __lt__(self, other):
        if self.age == other.age:
            return self.name < other.name
        return self.age < other.age

# 创建队列
q = PriorityQueue()

p1 = person('ack',18)
p2 = person('boo',18)
p3 = person("hehe",17)

q.put(p1)   # ack  18
q.put(p2)   # boo   18
q.put(p3)   # hehe  17

print(q.get().name)
print(q.get().name)
print(q.get().name)
hehe
ack
boo

运算符重载即 重写运算符方法。

以上是关于并发编程之队列的主要内容,如果未能解决你的问题,请参考以下文章

并发编程之队列

Python 3 并发编程多进程之队列(推荐使用)

python并发编程基础之守护进程队列锁

并发编程实践之公平有界阻塞队列实现

并发编程之ArrayBlockingQueue

并发编程之ArrayBlockingQueue