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() # 调用主函数

相关推荐
DogDaoDao5 分钟前
【第 05 篇】Python的字典与集合
开发语言·python·集合·字典
兰令水18 分钟前
leecodecode【单调栈】【2026.6.12打卡-java版本】
java·开发语言·算法
涛声依旧-底层原理研究所20 分钟前
混合检索 + 重排:让 AI Agent 拥有「既全又准」的认知骨架
人工智能·python
leagsoft_100321 分钟前
零信任选型五刀法——零信任怎么选?五个问题,五条红线
开发语言·php
努力写A题的小菜鸡23 分钟前
01-PyTorch加载数据初认识(dataset运用)
人工智能·pytorch·python
abcy07121325 分钟前
python fastapi celery hdfs 异步上传
python·hdfs·fastapi
Dxy123931021628 分钟前
Python多线程如何操作全局变量:从踩坑到最佳实践
python
AI人工智能+电脑小能手31 分钟前
【大白话说Java面试题 第112题】【并发篇】第12题:AQS 中节点的入队时机有哪些?
java·开发语言·面试
SilentSamsara32 分钟前
RAG 系统入门:LangChain/LlamaIndex + Chroma 向量数据库的检索增强实战
数据库·人工智能·python·青少年编程·langchain
IT WorryFree34 分钟前
Zabbix 7.4 API 可同步全量参数清单(同步第三方系统专用)
java·开发语言·zabbix