Python生产者与消费者模型

1、

coding : UTF-8

import threading, time # 导入相关模块

class Message: # 数据的描述类型

def init(self): # 构造方法

self.__title = None # 初始化属性

self.__content = None # 初始化属性

def set_info(self, title, content): # 进行属性内容的设置

self.__title = title # 设置属性内容

time.sleep(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(message): # 生产者处理函数

for num in range(50): # 生产50组数据

if num % 2 == 0 : # 交替生产

message.set_info("李兴华", "软件技术讲师")

else:

message.set_info("yootk", "www.yootk.com")

def consumer_handle(message): # 消费者处理函数

for num in range(50):

print(message) # 获取50次的数据

def main(): # 主函数

message = Message() # 公共保存的数据对象

producer_thread = threading.Thread(target=producer_handle, name="生产者线程", args=(message,))

consumer_thread = threading.Thread(target=consumer_handle, name="消费者线程", args=(message,))

producer_thread.start() # 启动线程

consumer_thread.start() # 启动线程

if name == "main": # 判断程序执行名称

main() # 调用主函数

2、

coding : UTF-8

import threading, time # 导入相关模块

class Message: # 数据的描述类型

def init(self, condition): # 构造方法

self.__title = None # 初始化属性

self.__content = None # 初始化属性

self.__condition = condition # 获取同步锁

flag = True表示可以生产,但是不能够消费

flag = False表示可以消费,但是不能够生产

self.__flag = True

def set_info(self, title, content): # 进行属性内容的设置

self.__condition.acquire() # 获取同步锁

if self.__flag == False: # 不能够继续生产了,必须进行消费处理

self.__condition.wait() # 当前的线程进入到阻塞状态

如果现在可以生产则一定会执行如下的代码操作,进行数据的设置,同时修改flag标志(此时的flag = True)

self.__title = title # 设置属性内容

time.sleep(1) # 进行操作的生产延迟

self.__content = content # 设置属性内容

print("【%s】title = %s、content = %s" % (threading.current_thread().name, self.__title, self.__content))

self.__flag = False # 现在已经生产过了

self.__condition.notify() # 唤醒其他等待的线程

self.__condition.release() # 释放锁

def str(self): # 获取数据将由消费者负责

self.__condition.acquire() # 获取锁

if self.__flag == True: # 不是消费状态

self.__condition.wait() # 等待生产者生产数据

如果执行了如下的代码,则意味着不进行等待(flag = False)

try:

time.sleep(0.8) # 消费者的延迟时间短

return "〖%s〗title = %s、content = %s" % (threading.current_thread().name, self.__title, self.__content)

finally:

self.__flag = True # 可以继续生产, 无法消费了

self.__condition.notify() # 唤醒其他等待的线程

self.__condition.release() # 释放锁

def producer_handle(message): # 生产者处理函数

for num in range(50): # 生产50组数据

if num % 2 == 0 : # 交替生产

message.set_info("李", "软件技术讲师")

else:

message.set_info("yootk", "www.com")

def consumer_handle(message): # 消费者处理函数

for num in range(50):

print(message) # 获取50次的数据

def main(): # 主函数

condition = threading.Condition() # 实例化条件锁

message = Message(condition) # 公共保存的数据对象

producer_thread = threading.Thread(target=producer_handle, name="生产者线程", args=(message,))

consumer_thread = threading.Thread(target=consumer_handle, name="消费者线程", args=(message,))

producer_thread.start() # 启动线程

consumer_thread.start() # 启动线程

if name == "main": # 判断程序执行名称

main() # 调用主函数

3、

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(worker_queue): # 生产者处理函数

for num in range(50): # 生产50组数据

message = Message() # 定义生产数据的包装类型

if num % 2 == 0 : # 交替生产

message.set_info("李兴华", "软件技术讲师")

else:

message.set_info("ww", "www.com")

worker_queue.put(message) # 将生产后的数据放到队列之中

def consumer_handle(worker_queue): # 消费者处理函数

for num in range(50):

print(worker_queue.get()) # 通过队列获取数据

def main(): # 主函数

worker_queue = queue.Queue(5) # 定义一个5个大小的队列

producer_thread = threading.Thread(target=producer_handle, name="生产者线程", args=(worker_queue,))

consumer_thread = threading.Thread(target=consumer_handle, name="消费者线程", args=(worker_queue,))

producer_thread.start() # 启动线程

consumer_thread.start() # 启动线程

if name == "main": # 判断程序执行名称

main() # 调用主函数

相关推荐
qianbo_insist27 分钟前
# 在 Qwen3.5-2B 上把 GDN-1 无损换成 GDN-2:一次完整的架构手术实验(负结果)
人工智能·pytorch·python·架构
多弗朗皮卡丘33 分钟前
C++的IO流
开发语言·c++·io流·文件io流
骑着蜗牛撵大象3271 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph
itmigrate1 小时前
Rust 里的所有权误区:不是不写 clone 就叫高性能
开发语言·后端·rust
Brilliantwxx1 小时前
【Linux】 文件访问与路径解析:目录、文件名、dentry、路径缓冲与 dcache 全解析
linux·运维·服务器·开发语言·spring
摇滚侠1 小时前
《On Java 中文版 基础卷》阅读笔记 初始化和清理 08
java·开发语言·笔记
xiangyun612 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl
专注仿真2 小时前
Agentic RAG算法详解
人工智能·python·大模型训练·控制算法
XiYang-DING2 小时前
P4009.和为K的子数组个数 & P5522.异或和为 k 的子数组个数
java·开发语言
学习论之费曼学习法2 小时前
无人值守AI内容矩阵实战(8):标题 A/B 实验的 6 个工程实现细节,隔日对比与自动判胜
人工智能·python·算法·矩阵·自动化·a/b测试·内容矩阵