py并发_线程操作队列笔记

线程操作队列

在程序开发之中,队列属于一种缓冲的结构,那么实际上对于当前的生产者与消费者模型之中最佳的处理性能是要引入一个队列进行数据保存。可以试想一种场景:在生产线上,每一位工人都必须保证正常的处理效率,那么否则就会出现产品的堆积,从而影响整条生产线的产能,如果说此时生产者生产数据很快,但是消费者比较慢,这种时候就会造成一种生产资源的严重浪费。

数据缓冲区(队列)

队列定义

数据缓冲区的实现可以依靠queue模块来实现,此模块提供了三种线程同步队列类的定义:

  • queue.Queue: 先进先出(FIFO)同步队列;
  • queue.LifoQueue: 后进先出(LIFO)同步队列;
  • queue.PriorityQueue: 优先级队列。

队列方法

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# coding :UTF-8
import threading,time,queue
class Message: # 数据的描述类型
def __init__(self): # 构造方法
self.__title = None
self.__content = None
def set_info(self,title,content):
self.__title = title # 设置属性内容
time.sleep(0.1) # 操作的生产延迟
self.__content = content # 设置属性内容
print("[%s]title = %s、content = %s" % (threading.current_thread().name,self.__title,self.__content))
def __str__(self): # 获取数据将由消费者负责
time.sleep(0.8) # 消费者的延迟时间短
return "【%s】title = %s、content = %s" % (
threading.current_thread().name,self.__title,self.__content)
def producer_handle(work_queue): # 生产者处理函数
for num in range(50): # 生产50组数据
message = Message()
if num % 2 == 0: # 交替生产
message.set_info("佳佳","下次见面时给我微笑吧%s" % num)
else:
message.set_info("你再坚持一下","他很快就痊愈了%s" % num)
work_queue.put(message)
def consumer_handle(work_queue): # 消费者处理函数
for num in range(50):
print(work_queue.get()) # 获取50次的数据
def main(): # 主函数
work_queue = queue.Queue(5)
producer_thread = threading.Thread(target=producer_handle,
name="生产者线程",
args=(work_queue,))
consumer_thread = threading.Thread(target=consumer_handle,
name="消费者进程",
args=(work_queue,))
producer_thread.start() # 启动线程
consumer_thread.start() # 启动线程
if __name__ == "__main__":
main()

[生产者线程]title = 佳佳、content = 下次见面时给我微笑吧0
[生产者线程]title = 你再坚持一下、content = 他很快就痊愈了1
[生产者线程]title = 佳佳、content = 下次见面时给我微笑吧2
[生产者线程]title = 你再坚持一下、content = 他很快就痊愈了3
[生产者线程]title = 佳佳、content = 下次见面时给我微笑吧4
[生产者线程]title = 你再坚持一下、content = 他很快就痊愈了5
[生产者线程]title = 佳佳、content = 下次见面时给我微笑吧6
【消费者进程】title = 佳佳、content = 下次见面时给我微笑吧0
[生产者线程]title = 你再坚持一下、content = 他很快就痊愈了7
【消费者进程】title = 你再坚持一下、content = 他很快就痊愈了1
[生产者线程]title = 佳佳、content = 下次见面时给我微笑吧8
【消费者进程】title = 佳佳、content = 下次见面时给我微笑吧2
[生产者线程]title = 你再坚持一下、content = 他很快就痊愈了9
【消费者进程】title = 你再坚持一下、content = 他很快就痊愈了3
[生产者线程]title = 佳佳、content = 下次见面时给我微笑吧10

……

此时程序中生产者线程执行性能,或者说是生产者的效率一定是会大幅度的提升,引用队列是一种提升生产者处理性能的一种必要的设计手段,而在实际的开发之中,会存在有一些消息中间件,这种中间件基本上利用了这种队列的形式来解决了数据过多而消费过慢的问题。


py并发_线程操作队列笔记
https://blog.wangxk.cc/2020/02/03/py并发-线程操作队列笔记/
作者
Mike
发布于
2020年2月3日
许可协议