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

你可能感兴趣的:(python,开发语言)