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

相关推荐
故事和你913 分钟前
洛谷-【图论2-1】树4
开发语言·数据结构·c++·算法·动态规划·图论
zmsofts4 分钟前
Maven核心能力深度解析:从项目管理到扩展机制
java·python·maven
故事和你916 分钟前
洛谷-【图论2-1】树1
开发语言·数据结构·c++·算法·深度优先·动态规划·图论
段ヤシ.8 分钟前
回顾Java知识点,面试题汇总Day5(持续更新)
java·开发语言
不会C语言的男孩17 分钟前
C++ SLTL编程
java·开发语言·c++
java修仙传20 分钟前
Java 实习日记:从业务表关系到节点价格分析接口改造
java·开发语言·实习
qq_4523962325 分钟前
第十四篇:《JMeter插件扩展:自定义函数与第三方插件》
开发语言·python·jmeter
敲代码的嘎仔30 分钟前
力扣高频SQL基础50题详解
开发语言·数据库·笔记·sql·算法·leetcode·后端开发
码农-阿杰32 分钟前
Java 线程等待唤醒机制深度解析:synchronized、ReentrantLock、LockSupport 底层实现对比
java·开发语言·c++
赤水无泪33 分钟前
Qt 全模块汇总列表
开发语言·qt