python模拟生产者消费者进程可视化tkinter

本博客展示了一个使用Python和tkinter实现的生产者消费者模型可视化程序。通过交互式按钮控制生产者和消费者的进程,演示了两者如何通过队列进行协调工作。
部署运行你感兴趣的模型镜像

python模拟生产者消费者进程可视化tkinter


模拟内容要求

利用C语言或JAVA语言或C++语言(手段不限),验证生产者与消费问题的过程。


一、效果截图

在这里插入图片描述
在这里插入图片描述

二、代码实现

from tkinter import *
from PIL import Image, ImageTk
import threading
import time
from queue import Queue

class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        photo = Image.open("images/apple.png").resize((32, 32))
        self.img = ImageTk.PhotoImage(photo)
        self.x1 = 20
        self.x2 = 20

        self.createWidget()

    def createWidget(self):
        """创建组件"""
        # 1.开始按钮
        self.b_start = Button(root, text="开始", width=10, height=1, command=self.start)
        self.b_start.place(relx=0.45, rely=0.11)
        # 2.生产者进程
        self.canvas1 = Canvas(root, width=210, height=50, bg="white")
        self.canvas1.place(relx=0.1, rely=0.08)
        self.canvas1.create_text(105, 25, text="生产者进程")
        self.b_produce = Button(root, text="开始生产", width=10, height=1, state="disabled", command=self.pro)
        self.b_produce.place(relx=0.1, rely=0.3)
        self.b_stop1 = Button(root, text="停止生产", width=10, height=1, state="disabled", command=self.stop1)
        self.b_stop1.place(relx=0.235, rely=0.3)
        # 3.缓冲器(队列)
        self.canvas2 = Canvas(root, width=350, height=80, bg="white")
        self.canvas2.place(relx=0.33, rely=0.4)
        self.canvas2.create_text(175, 40, text="缓冲器")
        # 4.消费者进程
        self.canvas3 = Canvas(root, width=210, height=50, bg="white")
        self.canvas3.place(relx=0.7, rely=0.6)
        self.canvas3.create_text(105, 25, text="消费者进程")
        self.b_consume = Button(root, text="开始消费", width=10, height=1, state="disabled", command=self.con)
        self.b_consume.place(relx=0.7, rely=0.78)
        self.b_stop2 = Button(root, text="停止消费", width=10, height=1, state="disabled", command=self.stop2)
        self.b_stop2.place(relx=0.835, rely=0.78)
        # 5.图片
        self.canvas1.create_image(20, 40, tag="pic1", image=self.img)
        self.canvas3.create_image(20, 40, tag="pic2", image=self.img)

    def start(self):
        """点击开始按钮"""
        self.b_stop1["state"] = "normal"  # 停止生产按钮解禁
        self.b_consume["state"] = "normal"  # 开始消费按钮解禁
        self.b_start["state"] = "disabled"  # 开始按钮禁用

        produce.start()  # 开始执行生产者线程
        consume.start()  # 开始执行消费者线程

    # 停止生产
    def stop1(self):
        self.b_produce["state"] = "normal"  # 开始生产按钮解禁
        self.b_stop1["state"] = "disabled"  # 停止生产按钮禁用
        produce.pause()  # 将暂停线程的标识设置为False

    # 开始生产
    def pro(self):
        self.b_stop1["state"] = "normal"  # 停止生产按钮解禁
        self.b_produce["state"] = "disabled"  # 开始生产按钮禁用
        # 当队列消费品满时 不做任何操作
        if q.qsize() == 9:
            return
        produce.resume()  # 将暂停线程的标识设置为True

    # 开始消费
    def con(self):
        self.b_stop2["state"] = "normal"
        self.b_consume["state"] = "disabled"
        # 当队列没有消费品时 不做任何操作
        if q.qsize() == 0:
            return
        consume.resume()  # 将暂停线程的标识设置为True

    # 停止消费
    def stop2(self):
        self.b_consume["state"] = "normal"
        self.b_stop2["state"] = "disabled"
        consume.pause()  # 将暂停线程的标识设置为False


    # 渲染缓冲器(队列)的图片
    def buffer(self):
        size = q.qsize()
        self.canvas2.delete("all")
        self.canvas2.create_text(175, 40, text="缓冲器")
        for i in range(size):
            self.canvas2.create_image(20+39*i, 60, image=self.img)

# 自定义生产者线程类
class produceThread(threading.Thread):
    def __init__(self):
        super().__init__()
        self.__flag = threading.Event()  # 用于暂停线程的标识 默认为False
        self.__flag.set()  # 设置为True

    def run(self):
        while True:
            app.canvas1.delete("pic1")
            while app.x1 < 250:
                app.canvas1.create_image(app.x1, 40, tag="pic1", image=app.img)
                app.canvas1.update()
                self.__flag.wait()  # 为True则立即返回 为False时阻塞直到内部的标识位为True后返回
                time.sleep(0.05)
                app.canvas1.delete("pic1")
                app.x1 += 10
            app.x1 = 20
            q.put(1)
            app.buffer()
            # 当可消费的对象溢出的时候
            if q.qsize() == 9:
                app.canvas1.create_image(app.x1, 40, tag="pic1", image=app.img)
                app.stop1()

    # 停止线程
    def pause(self):
        self.__flag.clear()  # 设置为False 让线程阻塞

    # 执行线程
    def resume(self):
        self.__flag.set()    # 设置为True 让线程停止阻塞

# 自定义消费者线程类
class consumeThread(threading.Thread):
    def __init__(self):
        super().__init__()
        self.__flag = threading.Event()  # 用于暂停线程的标识 默认为False

    def run(self):
        while True:
            app.canvas1.delete("pic2")
            while app.x2 < 250:
                app.canvas3.create_image(app.x2, 40, tag="pic2", image=app.img)
                app.canvas3.update()
                self.__flag.wait()  # 为True则立即返回 为False时阻塞直到内部的标识位为True后返回
                time.sleep(0.05)
                app.canvas3.delete("pic2")
                app.x2 += 10
            app.x2 = 20
            q.get()
            app.buffer()
            # 没有可消费的对象的时候
            if q.qsize() == 0:
                app.canvas3.create_image(app.x2, 40, tag="pic2", image=app.img)
                app.stop2()

    # 停止线程
    def pause(self):
        self.__flag.clear()  # 设置为False 让线程阻塞

    # 执行线程
    def resume(self):
        self.__flag.set()    # 设置为True 让线程停止阻塞

if __name__ == '__main__':
    root = Tk()
    root.geometry('1000x500+500+200')
    root.title('模拟生产者消费者进程')

    app = Application(master=root)
    q = Queue(maxsize=9)
    produce = produceThread()
    consume = consumeThread()
    produce.setDaemon(True)  # 设置线程守护
    consume.setDaemon(True)  # 设置线程守护

    root.mainloop()

说明

根据计算机系统实验要求制作,原创,使用python内置模块tkinter实现,只需要修改里面图片的路径即可

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

一、 课程设计目的 在多道程序环境下,进程同步问题十分重要,通过解决“生产者-消费者”问题,可以帮助我们更好的理解进程同步的概念及实现方法。掌握线程创建和终止的方法,加深对线程和进程概念的理解,会用同步与互斥方法实现线程之间的进行操作。 在学习操作系统课程的基础上,通过实践加深对进程同步的认识,同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。 二、 课程设计内容 模拟仿真“生产者-消费者”问题的解决过程及方法。 三、 系统分析与设计 1、 系统分析 在OS中引入进程后,虽然提高了资源的利用率和系统的吞吐量,但由于进程的异步性,也会给系统造成混乱,尤其是在他们争用临界资源时。为了对多个相关进程在执行次序上进行协调,以使并发执行的诸程序之间能有效地共享资源和相互合作,使程序的执行具有可再现性,所以引入了进程同步的概念。信号量机制是一种卓有成效的进程同步工具。 在生产者---消费者问题中应注意(信号量名称以多个生产者和多个消费者中的为例):首先,在每个程序中用于互斥的wait(mutex)和signal(mutex)必须成对出现;其次,对资源信号量empty和full的wait和signal操作,同样需要成对地出现,但它们分别处于不同的程序中。生产者消费者进程共享一个大小固定的缓冲区。其中,一个或多个生产者生产数据,并将生产的数据存入缓冲区,并有一个或多个消费者从缓冲区中取数据。 2、 系统设计: 系统的设计必须要体现进程之间的同步关系,所以本系统采用2个生产者、2个消费者 和20个缓冲区的框架体系设计。为了更能体现该系统进程之间的同步关系,系统的生产者消费者的速度应该可控,以更好更明显的表现出结果。 为了使本系统以更加简单、直观的形式把“消费者-生产者”问题表现出来,我选择了使 用可视化界面编程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值